c++ qt boost undefined-reference

c++ - referencia indefinida a la función de plantilla



qt boost (2)

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

El compilador 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<class T> QString convert2QString(T type , int digits=0); } #include "util_impl.h"

util_impl.h

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

Esta pregunta ya tiene una respuesta aquí:

Tengo tres archivos. Los contenidos de main.cpp son

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

util.h

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

util.cpp

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

Cuando intento compilar 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, int)'' collect2: ld returned 1 exit status

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


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<class T> QString convert2QString(T type , int digits=0); extern template <> QString convert2QString<int>(int type , int digits); }

util.cpp

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