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