2010-08-03 2 views
0

이것은 나에게 신비한 일입니다. 나는 우분투 ++ g을 사용하고, 내 코드의 일부이다 (클래스 이름 변경과 함께,하지만 아무것도 난 여전히 사방 스텁을 사용하고 있기 때문에) :템플릿이있는 클래스의 멤버 구현이있는 정의되지 않은 참조

Bob.hpp

template <class A> 
class Bob : public Jack<Chris, A> 
{ 
    public: 

     Bob(int x1, int x2, float x3 = 1.0, float x4 = 2.0, float x5 = 3.0) throw(Exception); 
     virtual ~Bob(); 
}; 

Bob.cpp

template <class A> 
Bob<A>::Bob(int x1, int x2, float x3, float x4, float x5) throw(Exception) 
{ 

} 

template <class A> 
Bob<A>::~Bob() 
{ 

} 

및 I : 나는이 같은 다른 파일에 구현 함수 main': main.cpp:(.text+0x1fd): undefined reference to 밥 : 밥 (INT, INT에서 :

g++ -c Bob.cpp -o Bob.o 
g++ -c main.cpp -o main.o 
g++ -L"libs" -llib main.o Bob.o prog 

나에게 main.o를 제공 :로 컴파일

MAIN.CPP

int main() 
{ 
    Bob<Alice> instance(1, 2); 
} 

:이처럼 사용 float, float) ' collect2 : ld가 1을 반환했습니다. 종료 상태

나는 완전히 엉망이되었습니다. g ++ 링크 단계로 순서를 변경하더라도 아무런 차이가 없습니다. 오브젝트 파일을 컴파일해도 문제는 발생하지 않습니다. 그리고 생성자를 구현할 때 왜 정의되지 않은 참조입니까? 누군가가 이것에 대해 어떤 생각을 밝힐 수 있다면, 대단히 감사 할 것입니다.

+2

[내 템플릿 클래스의 정의를 선언에서 분리하여 .cpp 파일에 넣을 수없는 이유는 무엇입니까?] (http://www.parashift.com/c++-faq-lite/templates.html)를 참조하십시오. # faq-35.12)를 C++ FAQ Lite에서 가져 왔습니다. –

+0

@James McNellis : 왜 대답하지 않으시겠습니까? :) –

+1

@Merlyn : 고품질 답변을 쓸 시간이 없었습니다. 링크 된 콘텐츠를 요약하지 않고도 답변으로 다른 사이트에 대한 링크를 게시하는 것은 일반적으로 나쁜 형태로 간주됩니다. –

답변

1

. 컴파일러에서 Bob.cpp에 Bob::BobBob::~Bob의 정의를 볼 때 어떤 유형의 Bob이 실제로 인스턴스화 될지 알지 못합니다 (즉 Bob<int>Bob<SomeClass>). 코드가 생성되지 않습니다. 또는 Bob.cpp 파일의 코드를 삽입,하지만 당신은 밥의 종류, 인스턴스화하려고하는 선언 할 필요가 예 : Bob.cpp의 내부 : 당신이 Bob<Alice>의 생성자가해야 생각

template 
class Bob<Alice>; 
1

클래스 템플릿 멤버 함수의 선언과 정의는 모두 동일한 헤더 파일에 있어야합니다.

Bob.cpp을 컴파일 할 때 컴파일러에는 선언과 정의가 모두 있습니다. 이 시점에서 인스턴스화가 없으므로 컴파일러는 템플릿 클래스에 대한 정의를 생성 할 필요가 없습니다. 컴파일러가 main.cpp을 컴파일하면 인스턴스화가 발생합니다. 템플릿 클래스 Bob<Alice>. 이 시점에서 컴파일러에는 선언이 있지만 정의가 없습니다!

0

다른 사람들이 제기 한 문제 외에 라이브러리는 GCC 명령 줄에서 마지막에 와야합니다. 대신에 :

g++ -L"libs" -llib main.o Bob.o prog 

당신이 원하는 : 당신은 Bob.hpp에 Bob.cpp에서 코드를 이동해야

g++ -L"libs" main.o Bob.o prog -llib 
+0

유효한 댓글이지만 실제로 질문에 대한 답변이 아닙니다. 나는 이것을 알았고, 내가 변경 한 다른 고치기 시도에서 남은 순서 방법은 많은 것을 포함하고 순서를 많이 연결한다. – TMP

0

Bob.cpp에 Bob<Alice>에 대한 언급이 없기 때문에 Bob.cpp에 정의되지 않았습니다.템플릿이 있는데 Bob.cpp가 Bob.o로 컴파일되었을 때 Bob<Alice>을 정의하는 데 사용될 수 있었지만 그렇지 않았습니다.

템플릿 정의를 Bob.hpp에 넣거나 Bob.cpp에 Bob<Alice>을 넣습니다.

+0

답변 해 주셔서 감사합니다! 내가 받아 들일만큼 멋지고 간결하지만 다른 사람들은 조금 더 "고기"를 가지고 있고 그것을 조금 더 가질 가치가있다. – TMP