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:
Implementar
convert2QString
en util.h.convert2QString
manualmenteconvert2QString
conint
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);
}