tube - Función de miembro de especialización parcial de plantilla de C++
tipos de plantillas en c++ (3)
14.5.5.3.1. La lista de parámetros de plantilla de un miembro de una especialización parcial de plantilla de clase debe coincidir con la lista de parámetros de plantilla de la especialización parcial de plantilla de clase. La lista de argumentos de la plantilla de un miembro de una especialización parcial de plantilla de clase coincidirá con la lista de argumentos de la plantilla de la especialización parcial de la plantilla de clase.
En otras palabras: ningún miembro parcialmente especializado sin clase parcialmente especializada.
Esta pregunta ya tiene una respuesta aquí:
Soy nuevo en las plantillas, así que tal vez esto sea algo trivial, pero no puedo hacerlo funcionar. Estoy tratando de obtener una especialización parcial de una función miembro de la clase. El código más corto sería:
template <typename T, int nValue> class Object{
private:
T m_t;
Object();
public:
Object(T t): m_t(t) {}
T Get() { return m_t; }
Object& Deform(){
m_t*=nValue;
return *this;
}
};
template <typename T>
Object<T,0>& Object<T,0>::Deform(){
this->m_t = -1;
return *this;
}
int main(){
Object<int,7> nObj(1);
nObj.Deform();
std::cout<<nObj.Get();
}
Intenté con las funciones que no son miembros y funcionó bien. Lo que también funciona bien es la especialización completa de una función miembro.
Pero, cada vez que lo intento con una especificación parcial. de una función miembro obtengo un error de la forma:
PartialSpecification_MemberFu.cpp(17): error: template argument
list must match the parameter list Object<T,0>& Object<T,0>::Deform().
Agradecería cualquier ayuda :-)
Desafortunadamente, no se puede especializar parcialmente la función miembro de una clase de plantilla. Puedes especializar parcialmente toda la clase o usar herencia. También puede usar ambos:
template <typename T, int nValue>
class Object {
protected:
T m_t;
public:
Object() = delete;
Object(T t): m_t(t) {}
T Get() { return m_t; }
Object& Deform() {
m_t *= nValue;
return *this;
}
};
template <typename T>
class Object<T,0> : public Object<T,1> {
public:
using Object<T,1>::Object;
Object& Deform() {
this->m_t = -1;
return *this;
}
};
No puede especializar parcialmente solo una función de miembro único, debe especializar parcialmente a toda la clase. Por lo tanto, necesitarás algo como:
template <typename T>
class Object<T, 0>
{
private:
T m_t;
Object();
public:
Object(T t): m_t(t) {}
T Get() { return m_t; }
Object& Deform()
{
std::cout << "Spec/n";
m_t = -1;
return *this;
}
};