2014-10-01 9 views
0

저는 C++에 비교적 익숙하지 않아 제 질문에 쉽게 대답 할 수 있습니다. 그러나 필자는 필자가 생각할 때 내 코드가 작동하지 않는 이유를 알 수 없습니다. 샘플 코드는 다음과 같습니다. C++ 템플릿 및 경비원 포함


//driver.cpp 
#include"a.h" 
#include <string> 
using namespace std; 

void main(){ 
    a<string> object; 
} 

내가 템플릿을 포함 할 때 오류에서 벗어날하는 방법에 대한 정보를 온라인으로 읽고있다

//a.cpp 

//#ifdef A 
#include "a.h" 
using namespace std; 

template<class T> 
a<T>::a(){ 
    str = 'a'; 
} 

//#endif 
//a.h 
#ifndef A 
#define A 

template<class T> 
class a{ 
public: 
    a(); 
private: 
    T str; 
}; 

#include "a.cpp" 
#endif 


. 그 중 하나는 제가 여기 달성하고자하는 것입니다 : #include "a.cpp"a.h에 가지고 있습니다. 그러나, 나는 샘플 코드에서 표시된 #include "a.h" a.cpp에서 여전히 사용 된 샘플을 사용합니다. 그러나 function template has already been defined 오류가 발생합니다. #ifdef A을 사용하고 a.cpp에서 #include "a.h"을 주석 처리하면이 재정의 오류를 제거하는 데 도움이된다는 것을 알았습니다. 그러나 나는 무슨 일이 일어나고 있는지 알고 싶다. 포함 재정의에 의한 재정의가 이미 a.h에 이루어져야하지 않습니까?

+2

모든 템플릿 내용을 헤더 파일에 넣고 잊어 버리십시오. –

+1

일반적으로 .cpp 파일을 포함하여 문제를 묻는 중입니다. 각 .cpp 파일을 한 번만 컴파일하면 프로그램을 빌드해야합니다. –

+0

@NeilKirk이 말했고 [여기에 이유가 있습니다] (http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file). –

답변

0

짧은 대답 : 구현이 선언과 동일한 헤더에 없으면 컴파일러에서 템플릿을 인스턴스화 할 때 액세스 할 수 없습니다.

0

템플릿 구현을 템플릿 선언과 분리하는 방법이 아닙니다. .h 파일에 .cpp 파일을 포함시키지 마십시오. 대신 .cpp 파일을 프로젝트 파일에 추가하거나 파일을 만들어 다른 모든 파일처럼 컴파일 할 수 있습니다. 그런 다음 연결 오류를 피하려면 Explicit Template Instantiation을 사용합니다.