二重コロンを使用して名前空間内のクラスを前方宣言できないのはなぜですか? 質問する

二重コロンを使用して名前空間内のクラスを前方宣言できないのはなぜですか? 質問する
class Namespace::Class;

なぜこれをやらなければならないのですか?

namespace Namespace {
    class Class;
}

VC++ 8.0 を使用すると、コンパイラは次を発行します。

エラー C2653: 'Namespace': クラス名または名前空間名ではありません

ここでの問題は、コンパイラがNamespaceクラスか名前空間かを判断できないということだと思います。しかし、これは単なる前方宣言なので、なぜこれが問題になるのでしょうか?

ある名前空間で定義されたクラスを前方宣言する別の方法はありますか? 上記の構文は、名前空間を「再オープン」してその定義を拡張しているように感じます。 がClass実際に で定義されていない場合はどうなるNamespaceでしょうか? これにより、ある時点でエラーが発生しますか?

ベストアンサー1

正解が出ていますね。言い換えてみましょう:

class Namespace::Class;

なぜこれをやらなければならないのですか?

この項はNamespace::Classコンパイラに次のことを伝えているため、これを実行する必要があります。

...OK、コンパイラ。Namespace という名前の名前空間を見つけて、その中で Class という名前のクラスを参照してください。

しかし、コンパイラは という名前の名前空間を認識していないため、何について話しているのかわかりませんNamespace。 という名前の名前空間があったとしてもNamespace、次のようになります。

namespace Namespace
{
};

class Namespace::Class;

それでもまだ動作しません。名前空間内のクラスをその名前空間外から宣言することはできないためです。名前空間内にいる必要があります。

つまり、実際に名前空間内でクラスを前方宣言することができます。次のようにします。

namespace Namespace
{
    class Class;
};

おすすめ記事