1. ホーム
  2. c++

[解決済み] 名前空間内のクラスをダブルコロンで順次宣言できないのはなぜですか?

2022-04-23 12:44:46

質問

class Namespace::Class;

なぜ、こんなことをしなければならないのか。

namespace Namespace {
    class Class;
}

VC++ 8.0を使用すると、コンパイラの問題が発生します。

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

この問題はコンパイラが Namespace はクラスなのか名前空間なのか? しかし、これは単なる前方宣言なので、なぜこれが問題になるのでしょうか?

ある名前空間で定義されたクラスを前方に宣言する他の方法はありますか? 上記の構文は、名前空間を開き直して、その定義を拡張しているように感じます。 もし Class で定義されていない場合は Namespace ? この場合、どこかのタイミングでエラーになるのでしょうか?

解決方法は?

なぜなら、できないからです。C++言語では、完全修飾名は、以下のものを参照するためにのみ使用されます。 既存 (すなわち、以前に宣言された)エンティティ。を導入するために使うことはできません。 新しい のエンティティを含む。

そして、あなたは 実際には、新しいエンティティを宣言するために名前空間を開き直す必要があります。もし、クラス Class が後で別の名前空間のメンバーとして定義された場合、それはここで宣言したものとは全く関係のない別のクラスとなります。

になったら、今度は 定義 を宣言した後、再度名前空間を開く必要はありません。グローバル・ネームスペース(または、あなたのクラスが含まれるネームスペース)で定義することができます。 Namespace というように)。

class Namespace::Class {
  /* whatever */
};

名前空間ですでに宣言されているエンティティを参照しているので Namespace を使用すると、修飾名 Namespace::Class .