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


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

Обновлен: Ноябрь 2007

Сообщение об ошибке

"идентификатор": недопустимый тип для параметра шаблона "параметр", не являющегося типом.
'identifier': illegal type for non-type template parameter 'parameter'.

Нельзя объявить шаблон с аргументом структуры или объединения. Чтобы передавать структуры и объединения в качестве параметров шаблона, следует использовать указатели.

Следующий пример демонстрирует причины возникновения ошибки C2993:

// C2993.cpp
// compile with: /c
// C2993 expected
struct MyStruct {
   int a;char b;
};

template <class T, struct MyStruct S>   // C2993

// try the following line instead
// template <class T, struct MyStruct * S>
class CMyClass {};

Это ошибка может также возникать в результате процедуры компилятора по согласованию, выполненной для Visual Studio .NET 2003 : параметры шаблона с плавающей точкой, не являющегося типом, недопустимы. Стандарты языка C++ не позволяют использовать не являющиеся типами параметры шаблона с плавающей точкой.

В случае с шаблоном функции следует использовать аргумент функции для передачи в параметр с плавающей точкой, не являющийся типом (данный код функционирует в Visual Studio .NET 2003 и в версиях Visual Studio .NET для Visual C++). Если речь идет о шаблоне класса, то простых путей решения проблемы не существует.

Дополнительные сведения см. в разделе Сводная информация о критических изменениях времени компиляции.

// C2993b.cpp
// compile with: /c
template<class T, float f> void func(T) {}   // C2993

// OK
template<class T>   void func2(T, float) {}