referencia indefinida a la función de plantilla

Tengo tres archivos. Los contenidos de main.cpp son

#include #include #include "util.h" int main() { using Util::convert2QString; using namespace std; int n =22; QString tmp = convert2QString(n); return 0; } 

util.h

 namespace Util { template QString convert2QString(T type , int digits=0); } 

util.cpp

 namespace Util { template QString convert2QString(T type, int digits=0) { using std::string; string temp = (boost::format("%1%") % type).str(); return QString::fromStdString(temp); } } 

Cuando bash comstackr estos archivos con el siguiente comando obtengo un error de referencia no definido

 vickey@tb:~/work/trash/template$ g++ main.cpp util.cpp -lQtGui -lQtCore -I. -I/usr/local/Trolltech/Qt-4.8.0/include/QtCore -I/usr/local/Trolltech/Qt-4.8.0/include/QtGui -I/usr/local/Trolltech/Qt-4.8.0/include /tmp/cca9oU6Q.o: In function `main': main.cpp:(.text+0x22): undefined reference to `QString Util::convert2QString(int, int)' collect2: ld returned 1 exit status 

¿Hay algún problema con la statement o implementación de la plantilla? ¿Por qué MI recibe estos errores de enlace?

La implementación de una plantilla no especializada debe ser visible para una unidad de traducción que la use.

El comstackdor debe poder ver la implementación para generar código para todas las especializaciones en su código.

Esto puede lograrse de dos formas:

1) Mueva la implementación dentro del encabezado.

2) Si desea mantenerlo separado, muévalo a un encabezado diferente que incluya en su encabezado original:

util.h

 namespace Util { template QString convert2QString(T type , int digits=0); } #include "util_impl.h" 

util_impl.h

 namespace Util { template QString convert2QString(T type, int digits=0) { using std::string; string temp = (boost::format("%1") % type).str(); return QString::fromStdString(temp); } } 

Tienes 2 formas:

  1. Implementar convert2QString en util.h.

  2. convert2QString manualmente convert2QString con int en util.cpp y definir esta especialización como función extern en util.h

util.h

 namespace Util { template QString convert2QString(T type , int digits=0); extern template <> QString convert2QString(int type , int digits); } 

util.cpp

  namespace Util { template QString convert2QString(T type, int digits) { using std::string; string temp = (boost::format("%1") % type).str(); return QString::fromStdString(temp); } template <> QString convert2QString(int type , int digits); }