2014-10-10 3 views
-2

3D 벡터 구현을위한 템플릿 클래스를 만들려고했습니다. 2 개의 파일 (vec3d.h 및 vec3d.cpp)의 관련 스 니펫은 here on pastebin입니다.인스턴스화 된 C++ 템플릿, 링커 정의되지 않은 참조?

#include "vec3d.h" 

#include <iostream> 

using namespace std; 

int main() 
{ 
    Vec3D<double> a(1,2,3), b(2,4,5), c; 
    c = 2.3*b; 
    cout<<c._x; 
    return 0; 
} 

g++ main.cpp vec3d.cpp vec3d.h에 다음과 같은 오류를 컴파일에 발생합니다 :

MAIN.CPP은 다음과 같습니다 I 별도로 함수의 정의와 선언을 뒀다

In function `main': 
main.cpp:(.text+0x124): undefined reference to `Vec3D<double> const operator*<double>(double, Vec3D<double> const&)' 
collect2: error: ld returned 1 exit status 

을하지만 double에 대한 템플릿을 인스턴스화했습니다.

충분히 재미있게도 c = b*2.3은 오류를 발생시키지 않습니다. 어떤 이유? 다른 여러 함수에서도 같은 오류가 발생합니다 (< <, ==,/all은 비슷한 방식으로 선언됩니다)

무엇이 잘못 되었나요? 해야으로

는 [[편집]

나는 클래스의 인스턴스를,하지만 난 클래스의 존재 밖에 템플릿 기능을 인스턴스화하지 않았다. 분명히, 나는 또한 그것을 인스턴스화해야한다. 그걸 몰랐어.

기타 : this question을 참조하십시오. 템플릿을 사용하여 정의 된 모든 C++ 단위는 클래스가 아닌 선언이있는 파일과 별도의 파일에 정의가있는 경우 인스턴스화해야합니다.

+0

명시 적 인스턴스화와 함께 클래스 'Vec3D'를 보여 주어야합니다. – 0x499602D2

+0

@ πάντα ῥεῖ "함수의 정의와 선언을 따로 따로 넣었으나 두 번 템플릿을 인스턴스화했습니다."- 선언과 정의를 분리하는 문제를 알고 있다고 생각하지만 템플릿을 인스턴스화했습니다. 더블. 나는 에러가'operator *'가 함수 템플릿이라는 것을 보여주기 때문에 그는 * 멤버 함수 * operator *를 명시 적으로 인스턴스화했지만 * global 하나는 보이지 않는다고 생각한다. (그림과 같이 왼쪽에 double을 취한다. 오류 있음). – 0x499602D2

+0

전역 연산자 함수를 명시 적으로 인스턴스화하는 것을 기억 했습니까? 'template Vec3D const 연산자 * (double, Vec3D const &)' – 0x499602D2

답변

1

필요한 연산자는 클래스의 인스턴스화에도 불구하고 인스턴스화되지 않습니다. 그들은 그 반원이 아니다. 그러므로 그들은 선언되었지만 그 정의는 발견되지 않는다.

전체 템플릿 클래스와 관련 연산자를 헤더에 구현해야합니다.

관련 문제