Поделиться через


Ошибка компилятора C2059

синтаксическая ошибка: "лексема"

Лексема привела к синтаксической ошибке.

В следующем примере выдается сообщение об ошибке для строки с объявлением j.

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

Чтобы определить причину ошибки, проверьте не только строку, указанную в сообщении об ошибке, но и строки выше нее. Если проверка строк не проясняет причину проблемы, попробуйте закомментировать строку, указанную в сообщении об ошибке и, возможно, несколько предшествующих строк.

Если сообщение об ошибке указывает на символ, непосредственно следующий за переменной typedef, проверьте, определена ли эта переменная в исходном коде.

Сообщение об ошибке C2059 может возникать, если символ раскрывается в пустую строку, что может происходить, например, при компиляции с параметром вида /Dsymbol**=**.

// 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 или на веб-узле https://support.microsoft.com.