c++ - Especialización de plantillas de un único método de una clase con plantilla
visual-studio-2008 templates (4)
Siempre teniendo en cuenta que el siguiente encabezado, que contiene mi clase de plantilla, está incluido en al menos dos archivos .CPP
, este código se compila correctamente:
template <class T>
class TClass
{
public:
void doSomething(std::vector<T> * v);
};
template <class T>
void TClass<T>::doSomething(std::vector<T> * v) {
// Do somtehing with a vector of a generic T
}
template <>
inline void TClass<int>::doSomething(std::vector<int> * v) {
// Do somtehing with a vector of int''s
}
Pero tenga en cuenta la línea en el método de especialización. Se requiere que el código no tenga un error de enlazador (en VS2008 es LNK2005) debido a que el método se define más de una vez. Entiendo esto porque AFAIK una especialización de plantilla completa es lo mismo que una definición de método simple.
Entonces, ¿cómo elimino eso en inline
? El código no debería duplicarse en cada uso de este. Busqué en Google, leí algunas preguntas aquí en SO e intenté muchas de las soluciones sugeridas, pero ninguna fue creada con éxito (al menos no en VS 2008).
¡Gracias!
Al igual que con las funciones simples, puede usar la declaración y la implementación. Ponga en su declaración de encabezado:
template <>
void TClass<int>::doSomething(std::vector<int> * v);
y ponga la implementación en uno de sus archivos cpp:
template <>
void TClass<int>::doSomething(std::vector<int> * v) {
// Do somtehing with a vector of int''s
}
No te olvides de eliminar en línea (lo olvidé y pensé que esta solución no funcionaría :)). Controlado en VC ++ 2005
Debe mover la definición de especialización a archivo CPP. La especialización de la función miembro de la clase de plantilla está permitida incluso si la función no se declara como plantilla.
No hay razón para eliminar la palabra clave en línea.
No cambia el significado del código de todos modos.
Si desea eliminar el en línea por cualquier razón, la solución de maxim1000 es perfectamente válida.
En su comentario, sin embargo, parece que cree que la palabra clave en línea significa que la función con todos sus contenidos siempre está en línea, pero AFAIK es realmente muy dependiente de la optimización del compilador.
Citando de las preguntas frecuentes de C ++
Hay varias formas de designar que una función está en línea, algunas de las cuales implican la palabra clave en línea, otras no. No importa cómo designe una función como en línea, es una solicitud que el compilador puede ignorar: el compilador puede expandir en línea algunos, todos o ninguno de los lugares donde llama a una función designada como en línea. (No se desanime si eso parece irremediablemente vago. La flexibilidad de lo anterior es en realidad una gran ventaja: permite que el compilador trate funciones grandes de forma diferente a las pequeñas, además permite que el compilador genere código que es fácil de depurar si selecciona las opciones correctas del compilador).
Por lo tanto, a menos que sepa que esa función realmente hinchará su ejecutable o, a menos que quiera eliminarla del encabezado de definición de plantilla por otros motivos, puede dejarla donde está sin ningún daño.