Error del compilador C2910

'función': no puede estar especializada de forma explícita

El compilador ha detectado un intento de especializar explícitamente una función dos veces.

El ejemplo siguiente genera el error 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

El error C2910 se puede producir también si intenta especializar explícitamente un miembro que no es de plantilla. Es decir, solo puede especializar explícitamente una plantilla de función.

El ejemplo siguiente genera el error 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){}

Este error también puede deberse a una operación de conformidad del compilador para Visual Studio .NET 2003.

Para que el código sea válido en las versiones de Visual C++ de Visual Studio .NET 2003 y Visual Studio .NET, quite template <>.

El ejemplo siguiente genera el error 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