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++ 단위는 클래스가 아닌 선언이있는 파일과 별도의 파일에 정의가있는 경우 인스턴스화해야합니다.
명시 적 인스턴스화와 함께 클래스 'Vec3D'를 보여 주어야합니다. – 0x499602D2
@ πάντα ῥεῖ "함수의 정의와 선언을 따로 따로 넣었으나 두 번 템플릿을 인스턴스화했습니다."- 선언과 정의를 분리하는 문제를 알고 있다고 생각하지만 템플릿을 인스턴스화했습니다. 더블. 나는 에러가'operator *'가 함수 템플릿이라는 것을 보여주기 때문에 그는 * 멤버 함수 * operator *를 명시 적으로 인스턴스화했지만 * global 하나는 보이지 않는다고 생각한다. (그림과 같이 왼쪽에 double을 취한다. 오류 있음). – 0x499602D2
전역 연산자 함수를 명시 적으로 인스턴스화하는 것을 기억 했습니까? 'template Vec3D const 연산자 * (double, Vec3D const &)' –
0x499602D2