编译器错误 C2872

“symbol”:符号不明确

编译器无法确定引用的是哪个符号。 范围中有多个具有指定名称的符号。 请参阅错误消息后面的说明,了解编译器为不明确的符号找到的文件位置和声明。 若要解决此问题,可以使用其命名空间(例如 std::byte::byte)来完全限定不明确的符号。 还可以使用命名空间别名为包含的命名空间提供一个方便的短名称,以便在源代码中消除符号歧义时使用。

如果头文件包含 using 指令,并且包含后续的头文件,该头文件包含同样在 using 指令指定的命名空间中的类型,则可能发生 C2872。 仅在使用 #include 指定所有头文件之后才能指定 using 指令。

在 Visual Studio 2013 中,由于 Windows::Foundation::Metadata::Platform 枚举类型和 C++/CX 定义的 Platform 命名空间之间的冲突,可能会发生 C2872。 若要解决此问题,请按照以下步骤操作:

  • 从项目文件中删除“using namespace Windows::Foundation::Metadata”子句。

  • 为此命名空间中包含的任何类型指定完全限定名称。

示例

下面的示例生成 C2872,因为对名为 i 的变量进行了不明确的引用;范围内存在两个名词相同的变量:

// 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.
}