编译器错误 C2059

语法错误 :“token”

该标记导致语法错误。

下面的示例对声明 j 的行生成了错误消息。

// C2059e.cpp
// compile with: /c
// C2143 expected
// Error caused by the incorrect use of '*'.
   int j*; // C2059 

若要确定该错误的原因,则不仅要检查在错误消息中列出的行,还要检查该行上面的行。 如果对行的检查没有获得有关可能出现的问题的任何线索,则尝试注释掉在错误消息中列出的行以及可能出现在该行上面的若干行。

如果该错误消息在紧跟 typedef 变量的符号上出现,则检查该变量是否已在源代码中定义。

如果符号没有计算出任何结果(在使用 /Dsymbol**=** 编译时可能发生),可能会导致 C2059。

// C2059a.cpp
// compile with: /DTEST=
#include <stdio.h>

int main() {
   #ifdef TEST
      printf_s("\nTEST defined %d", TEST);   // C2059
   #else
      printf_s("\nTEST not defined");
   #endif
}

可能收到 C2059 的另一个特定原因是编译在函数的默认参数中指定了结构的应用程序。 参数的默认值必须是一个表达式。 初始值设定项列表(如用于初始化结构的初始值设定项列表)不是表达式。 其解决方法是定义一个执行所需初始化的构造函数。

下面的示例生成 C2059:

// C2059b.cpp
// compile with: /c
struct ag_type {
   int a;
   float b;
   // Uncomment the following line to resolve.
   // ag_type(int aa, float bb) : a(aa), b(bb) {} 
};

void func(ag_type arg = {5, 7.0});   // C2059
void func(ag_type arg = ag_type(5, 7.0));   // OK

如果您在类外定义成员模板类或函数,也可能获得 C2059。 有关更多信息,请参见知识库文章 Q241949。

对于格式错误的强制转换,会发生 C2059。

下面的示例生成 C2059:

// C2059c.cpp
// compile with: /clr
using namespace System;
ref class From {};
ref class To : public From {};

int main() {
   From^ refbase = gcnew To();
   To^ refTo = safe_cast<To^>(From^);   // C2059
   To^ refTo2 = safe_cast<To^>(refbase);   // OK
}

如果尝试创建一个包含句点的命名空间名称,也会发生 C2059。

下面的示例生成 C2059:

// C2059d.cpp
// compile with: /c
namespace A.B {}   // C2059

// OK
namespace A  {
   namespace B {}
}

如果在类外定义成员模板类或函数,也会发生 C2059。 有关更多信息,请参见知识库文章 Q241949。 您可以查找 MSDN Library CD-ROM 上或 https://support.microsoft.com/default.aspx?ln=zh-cn 上的知识库文章。