저는 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
에 이루어져야하지 않습니까?
모든 템플릿 내용을 헤더 파일에 넣고 잊어 버리십시오. –
일반적으로 .cpp 파일을 포함하여 문제를 묻는 중입니다. 각 .cpp 파일을 한 번만 컴파일하면 프로그램을 빌드해야합니다. –
@NeilKirk이 말했고 [여기에 이유가 있습니다] (http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file). –