반응형
템플릿 함수에 대한 정의되지 않은 참조
이 질문에 이미 답변이 있습니다.
세 개의 파일이 있습니다. main.cpp의 내용은 다음과 같습니다.
#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);
}
}
다음 명령으로 이러한 파일을 컴파일하려고하면 정의되지 않은 참조 오류가 발생합니다.
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
템플릿 선언이나 구현에 문제가 있습니까? MI가 이러한 연결 오류가 발생하는 이유 :?
특수화되지 않은 템플릿의 구현은이를 사용하는 번역 단위에 표시되어야합니다.
컴파일러는 코드의 모든 전문화에 대한 코드를 생성하기 위해 구현을 볼 수 있어야합니다.
이는 두 가지 방법으로 달성 할 수 있습니다.
1) 구현을 헤더 내부로 이동하십시오.
2) 별도로 유지하려면 원본 헤더에 포함 된 다른 헤더로 이동하세요.
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);
}
}
두 가지 방법이 있습니다.
Implement
convert2QString
in util.h.Manually instantiate
convert2QString
withint
in util.cpp and define this specialization as extern function in 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);
}
참고URL : https://stackoverflow.com/questions/10632251/undefined-reference-to-template-function
반응형
'developer tip' 카테고리의 다른 글
정적 멤버에 대한 정의되지 않은 참조 (0) | 2020.11.04 |
---|---|
JSON.NET 라이브러리없이 JSON을 구문 분석하는 방법은 무엇입니까? (0) | 2020.11.04 |
maven 오류 : org.junit 패키지가 없습니다. (0) | 2020.11.03 |
단편-지정된 하위에 이미 상위가 있습니다. (0) | 2020.11.03 |
회사 네트워크에서 이미지를 빌드하는 동안 네트워크 호출이 실패 함 (0) | 2020.11.03 |