正しい答えが得られています。もう一度言い直してみましょう:
class Namespace::Class;
Namespace::Class
という用語があるため、これを行う必要があります。 コンパイラに伝えています:
しかし、コンパイラは Namespace
という名前の名前空間を認識していないため、何について話しているのかわかりません。 . Namespace
という名前の名前空間があったとしても 、次のように:
namespace Namespace
{
};
class Namespace::Class;
名前空間の外部から名前空間内のクラスを宣言することはできないため、それでも機能しません。名前空間にいる必要があります。
したがって、実際には名前空間内でクラスを前方宣言できます。これを行うだけです:
namespace Namespace
{
class Class;
};
できないからです。 C++ 言語では、完全修飾名は 既存 を参照するためにのみ使用されます (つまり、以前に宣言された) エンティティ。 新しいの導入には使用できません
そしてあなたは 実際、名前空間を「再開」して、新しいエンティティを宣言します。クラス Class
の場合 後で別の名前空間のメンバーとして定義されます。これは、ここで宣言したクラスとはまったく関係のない完全に異なるクラスです。
定義のポイントに到達したら 事前に宣言されたクラスであるため、名前空間を再度「開く」必要はありません。グローバル名前空間 (または Namespace
を囲む任意の名前空間) で定義できます。 )として
class Namespace::Class {
/* whatever */
};
名前空間 Namespace
で既に宣言されているエンティティを参照しているため 、修飾名 Namespace::Class
を使用できます .
同じ理由で、次のようにネストされた名前空間を一度に宣言できないのだと思います:
namespace Company::Communications::Sockets {
}
これを行う必要があります:
namespace Company {
namespace Communications {
namespace Sockets {
}
}
}