반응형
헤더와 구현이 분리된 template을 아래와 같이 MyTemplate.h라는 헤더만 include하게 되면 컴파일 시 링크오류가 발생한다.
(xcode 에선 Undefined symbol)
main.cpp
1
2
3
4
5
6
7
8
9
10
|
#include <iostream>
#include "MyTemplate.h"
int main(int argc, const char * argv[]) {
MyTemplate<int> myTemplateInt(1,1);
myTemplateInt.show();
return 0;
}
|
cs |
MyTemplate.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#ifndef MyTemplate_h
#define MyTemplate_h
template <typename T>
class MyTemplate {
public:
MyTemplate(T t1, T t2);
void show();
private:
T t1;
T t2;
};
#endif
|
cs |
MyTemplate.cpp
1
2
3
4
5
6
7
8
9
10
11
12
|
#include <iostream>
#include "MyTemplate.h"
using namespace std;
template <typename T>
MyTemplate<T>::MyTemplate(T t1, T t2) : t1(t1), t2(t2)
{}
template <typename T>
void MyTemplate<T>::show() {
cout<<"T1 : "<<t1 <<" T2 : "<<t2<<endl;
}
|
cs |
이와같이 에러가 발생하는 이유는 컴파일 입장에서 컴파일 시 템플릿에 전달되는 타입에 따라 템플릿 클래스를 만들어야 하기 때문이다. 따라서 사용하는 입장(main)에서는 템플릿의 바디에 대한 정보(MyTemplate.cpp)가 필요한 것이다.
해결방법
1. cpp파일 include
1
2
3
|
#include "MyTemplate.h"
#include "MyTemplate.cpp"
|
cs |
2. 헤더파일에 바디 구현
템플릿을 라이브러리로 제공할 예정이면 아래와 같이 헤더파일 내에 모두 구현해야 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#ifndef MyTemplate_h
#define MyTemplate_h
#include <iostream>
using namespace std;
template <typename T>
class MyTemplate {
public:
MyTemplate(T t1, T t2) : t1(t1), t2(t2)
{}
void show() {
cout<<"T1 : "<<t1 <<" T2 : "<<t2<<endl;
}
private:
T t1;
T t2;
};
#endif
|
cs |
반응형
'C and C++' 카테고리의 다른 글
[C] C에서 생성자 소멸자 흉내기 (0) | 2020.10.11 |
---|---|
[C++][STL] STL을 활용하여 상한값 하한값 단순화 (0) | 2020.05.03 |
[C++] 순환참조(Circular Dependency) 제거하는 방법 (1) | 2020.04.12 |
[C++][STL] size()함수 주의사항 (0) | 2020.01.29 |
[C++] 상속 팁 overide와 final 키워드 (0) | 2019.10.13 |