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


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

синтаксическая ошибка: идентификатор "идентификатор"

Компилятор нашел идентификатор, в котором он не ожидался. Прежде чем использовать его, убедитесь, что identifier он объявлен.

Инициализатор может быть заключен в скобки. Чтобы избежать этой проблемы, заключите декларатор в скобки или сделайте его typedef.

Эта ошибка также может быть вызвана, когда компилятор обнаруживает выражение в качестве аргумента шаблона класса; используйте имя типа, чтобы сообщить компилятору, что это тип, как показано в следующем примере:

Следующий пример приводит к возникновению ошибки C2061:

// C2061.cpp
// compile with: /std:c++17

template <A a> // C2061
class C1 {};

template <typename A a> // ok
class C2 {};

template <typename T>
class C3
{
   // Both are valid since C++20
   using Type1 = T::Type; // C2061
   using Type2 = typename T::Type; // OK
};

int main()
{
   int x;
   unsigned a1 = alignof(x);   // C2061
   unsigned a2 = alignof(int); // OK
   unsigned a3 = alignof(decltype(x)); // OK
}

Чтобы устранить ошибку с template<A a> class C1{};помощью , используйте template <typename a> class C1 {};
Чтобы устранить проблему с using Type1 = T::Type;помощью , используйте using Type1 = typename T::Type;
Чтобы устранить проблему alignof(x), замените аргумент типом x. В этом случае int или decltype(x);

C2061 может произойти, если передать имя экземпляра в типид:

// C2061b.cpp
// compile with: /clr
ref struct G
{
   int i;
};

int main()
{
   G ^pG = gcnew G;
   System::Type ^ pType = typeid<pG>;   // C2061
   System::Type ^ pType2 = typeid<G>;   // OK
}