Esta pequeña pieza de código provoca la ira del enlazador cuando se incluye en al menos dos unidades de traducción (cpp):¿Por qué el enlazador se queja de múltiples definiciones en esta plantilla?
# ifndef MAXIMUM_HPP
# define MAXIMUM_HPP
template<typename T>
T maximum(const T & a, const T & b)
{
return a > b ? a : b ;
}
/* dumb specialization */
template<>
int maximum(const int & a, const int & b)
{
return a > b ? a : b ;
}
# endif // MAXIMUM_HPP
Pero compila y enlaza bien con una unidad de traducción. Si elimino la especialización, funciona bien en todas las situaciones. Aquí está el mensaje del enlazador:
g++ -o test.exe Sources\test.o Sources\other_test.o
Sources\other_test.o:other_test.cpp:(.text+0x0): multiple definition of `int maximum<int>(int const&, int const&)'
Sources\test.o:test.cpp:(.text+0x14): first defined here
¿No se pueden crear instancias de las plantillas varias veces? ¿Cómo explicar este error y cómo solucionarlo?
¡Gracias por cualquier consejo!
Probablemente debería devolver una referencia de sus funciones. – Dani
Fue solo un ejemplo resultante de rastrear los errores que encontré en un código más complejo. Creo que el ejemplo puede ser más claro sin ninguna referencia :) – overcoder