Ошибка компилятора 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.