2

私はちょうどこのエラーを受け取っていました:「エラー: 'Symbol' は型に名前を付けていません」

循環依存関係について話している他のいくつかの StackOverflow の質問を見つけましたが、ここではそうではありません。実際、これをソースファイルの先頭に置くことで再現できました:

class Symbol{int dummy;};
//class Symbol{int again;};
Symbol global_symbol;

これにより、3 行目に「エラー: 'Symbol' に型の名前がありません」と表示されます。2行目のコメントを外しても、同じエラーが表示されますが、その直前に「エラー:「クラスシンボル」の再定義」が表示されます!!

さらにいろいろ調べてみると、サードパーティのライブラリにenumwhereSymbolが定義されているように見えます。そのライブラリも私自身のコードも名前空間を使用していないため、コードを名前空間内に移動することはすでにやることリストにあったので、次にそれを行い、問題が解決することを願っています.

class Symbol{}しかし、私を混乱させているのは、なぜ回線でエラーが発生しなかったのですか? 列挙型と競合する場合、そのクラスをインスタンス化できないほどである場合、なぜ文句を言わなかったのですか? g++のフラグがないか、C++ の知識にギャップがあるように感じます。これはバグではなく機能だと誰かに言われるのを待っています。

(ところで、私が使用g++ -c -std=gnu++0x -Wall -g -Werror ...しているのはg ++ 4.8.1です)

4

2 に答える 2

2

表示されているのは、名前の非表示の形式です。変数または関数の宣言は、([basic.scope.hiding] §3.3.10/2) よりSymbol優先して検出されます。class SymbolC++ で 1 つの宣言が同じスコープ内の別の宣言を非表示にできる場合、非表示の宣言を引き続き参照する精巧な型指定子が常に存在します。タイプ (classまたはenum) のみがこの方法で隠される可能性があるため、このように命名されています。typedef とテンプレートはできません。宣言の順序は重要ではありません。

この場合、class Symbol変数または関数がスコープ内にあるときにクラスを参照するために使用できます。

class Symbol global_symbol;
于 2014-04-29T04:53:23.080 に答える