Ошибка компилятора C2910
Обновлен: Ноябрь 2007
Сообщение об ошибке
"функция" : явная специализация невозможна
'function' : cannot be explicitly specialized
Компилятор обнаружил попытку повторной явной специализации функции.
Следующий пример приводит к возникновению ошибки C2910:
// C2910.cpp
// compile with: /c
template <class T>
struct S;
template <> struct S<int> { void f() {} };
template <> void S<int>::f() {} // C2910 delete this specialization
Ошибка C2910 также может возникать при попытке явной специализации нешаблонного элемента. Это означает, что явная специализация возможна только для функций-шаблонов.
Следующий пример приводит к возникновению ошибки C2910:
// C2910b.cpp
// compile with: /c
template <class T> struct A {
A(T* p);
};
template <> struct A<void> {
A(void* p);
};
template <class T>
inline A<T>::A(T* p) {}
template <> A<void>::A(void* p){} // C2910
// try the following line instead
// A<void>::A(void* p){}
Данная ошибка также может возникать в результате работы по стандартизации компилятора, проведенной в Visual Studio .NET 2003.
Для обеспечения допустимости кода в версиях Visual C++ в средах Visual Studio .NET 2003 и Visual Studio .NET следует удалить template <>.
Дополнительные сведения см. в разделе Сводная информация о критических изменениях времени компиляции.
Следующий пример приводит к возникновению ошибки C2910:
// C2910c.cpp
// compile with: /c
template <class T> class A {
void f();
};
template <> class A<int> {
void f();
};
template <> void A<int>::f() {} // C2910
// try the following line instead
// void A<int>::f(){} // OK