2016-12-16 13 views
3

これはクラン/ GCCでコンパイル罰金のVisual C++は、非あいまいなクラスのあいまいなシンボルエラーを報告

namespace { 
    class ExprParentFinder { 
    friend class CodeCompletionTypeContextAnalyzer; 
    }; 
} 

class CodeCompletionTypeContextAnalyzer { 
public: 
    CodeCompletionTypeContextAnalyzer() {} 
}; 

int main() { 
    CodeCompletionTypeContextAnalyzer TypeAnalyzer; 
    return 0; 
} 

、以下のC++のコードを考えてみましょう。 (あいまいなシンボル

1> consoleapplication2.cpp:しかし、MSVCはチョーク、およびレポート

1> ConsoleApplication2.cpp

1> consoleapplication2.cpp(29):エラーC2872: 'CodeCompletionTypeContextAnalyzer' 23):注:注:consoleapplication2.cpp(19)> 'CodeCompletionTypeContextAnalyzer'

1かもしれないか '`匿名の名前空間' :: CodeCompletionTypeContextAnalyzer」

CodeCompletionTypeContextAnalyzer TypeAnalyzerはここではC++標準の観点からはあいまいですが、これはMSVCバグです。もしそうなら、このエラーの原因は何ですか。

回避するには、これは(すなわち、MSVCのバグ)整形しかし、あなたが実際に欲しいものになることはほとんどありません

int main() { 
    ::CodeCompletionTypeContextAnalyzer TypeAnalyzer; 
    return 0; 
} 
+0

'CodeCompletionTypeContextAnalyzer'クラスはこれまでに宣言されていますか? – Dai

+0

これは最小限の再現可能な例です。このコードファイルは、あいまいさを示すために必要な唯一のものです。 –

+0

'ExprParentFinder'が宣言されていない場合、' CodeCompletionTypeContextAnalyzer'の存在を知る方法は? – DrPepperJo

答えて

2

にコードを変更することです。 [namespace.memdef]/3は、脚注省略:

非ローカルクラスでfriend宣言はファーストクラス、 関数、クラステンプレートまたは関数テンプレートを宣言した場合友人は、最も内側の名前空間のメンバー です。 friend宣言では、 ([basic.lookup.unqual])または修飾ルックアップ([basic.lookup.qual])に名前を表示させることはできません。 は名前を非表示にします。

friend class CodeCompletionTypeContextAnalyzer;は無名の名前空間のメンバーであるCodeCompletionTypeContextAnalyzerを宣言していますが、その名前は、名前の検索には表示されません。

そして、class CodeCompletionTypeContextAnalyzer { /* ... */ };は宣言(および定義)クラスは、グローバルネームスペースの 部材としてCodeCompletionTypeContextAnalyzerと呼ばれる異なります。このクラスはExprParentFinderの友人ではありません。

名前のない名前空間のCodeCompletionTypeContextAnalyzerは名前のルックアップに表示されないため、見つかることがあるCodeCompletionTypeContextAnalyzerのみが曖昧さがありません。

関連する問題