编译器错误 C2059

语法错误:“令牌”

此令牌导致语法错误。

以下示例为声明 j 的行生成错误消息。

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

若要确定错误的原因,不仅要检查错误消息中列出的行,还要检查其上方的行。 如果检查这些行没有与该问题相关的线索,请尝试注释掉错误消息中列出的行,并且可能要注释掉其上方的几行。

如果错误消息发生在紧跟 typedef 变量的符号上,请确保变量在源代码中定义。

当预处理器符号名称重新用作标识符时,将引发 C2059。 在以下示例中,编译器将 DIGITS.ONE 视为数字 1,为枚举元素名称时无效:

#define ONE 1

enum class DIGITS {
    ZERO,
    ONE // error C2059
};

如果符号的计算结果为无,则可能会获得 C2059,就像使用 /D符号= 编译时一样。

// 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 可能发生在所有格式不佳的强制转换中。

下面的示例生成 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 {}
}

可限定名称(::->.)的运算符后面必须跟有关键字 template 时,可能发生 C2059,如下例所示:

template <typename T> struct Allocator {
    template <typename U> struct Rebind {
        typedef Allocator<U> Other;
    };
};

template <typename X, typename AY> struct Container {
    typedef typename AY::Rebind<X>::Other AX; // error C2059
};

默认情况下,C++ 会假定 AY::Rebind 不是模板;因此,后面的 < 解释为小于号。 必须显式告知编译器 Rebind 是模板,以便其正确分析尖括号。 若要更正此错误,请在依赖类型的名称上使用 template 关键字,如下所示:

template <typename T> struct Allocator {
    template <typename U> struct Rebind {
        typedef Allocator<U> Other;
    };
};

template <typename X, typename AY> struct Container {
    typedef typename AY::template Rebind<X>::Other AX; // correct
};