コンパイラ エラー C2872
'symbol': あいまいなシンボルです
コンパイラは、参照しているシンボルを特定できません。 指定された名前の複数のシンボルがスコープ内にあります。 あいまいなシンボルに対してコンパイラが検出したファイルの場所と宣言については、エラー メッセージに続く注意事項を参照してください。 この問題を修正するには、名前空間 (std::byte
や ::byte
など) を使用して、あいまいなシンボルを完全に修飾できます。 名前空間エイリアスを使用して、含まれている名前空間に、ソース コード内のシンボルを明確にするときに使用する便利な短い名前を付けることもできます。
C2872 は、ヘッダー ファイルに using ディレクティブが含まれていて、using
ディレクティブで指定された名前空間にもある型を含む後続のヘッダー ファイルが含まれている場合に発生する可能性があります。 すべてのヘッダー ファイルが #include
で指定された後でのみ、using
ディレクティブを指定します。
C2872 は、Windows::Foundation::Metadata::Platform
列挙型と C++/CX で定義された Platform
名前空間の間の競合が原因で Visual Studio 2013 で発生する可能性があります。 この問題を回避するには、次の手順を実行します。
"using namespace Windows::Foundation::Metadata" 句をプロジェクト ファイルから削除します。
この名前空間に含まれる型の完全修飾名を指定します。
例
次の例では、i
という名前の変数があいまいに参照されているため、C2872 が生成されます。同じ名前の 2 つの変数がスコープ内にあります。
// C2872.cpp
// compile with: cl /EHsc C2872.cpp
namespace A {
int i;
}
using namespace A;
int i;
int main() {
::i++; // ok, uses i from global namespace
A::i++; // ok, uses i from namespace A
i++; // C2872 ambiguous: ::i or A::i?
// To fix this issue, use the fully qualified name
// for the intended variable.
}