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

正しい答えが得られています。もう一度言い直してみましょう:

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 {
    }
  }
}