2016-10-05 2 views
0

나는 템플릿 기반 클래스를 사용하는 법을 배우려하고있다. 모든 데이터 형식이 될 수있는 2 개의 숫자를 포함하는 간단한 템플릿 클래스 numbers을 만들었습니다. 그런 다음 객체의 더 큰 수를 반환하는 메서드를 만들었습니다. 어떤 이유로 링커 오류가 계속 발생합니다 ... 여기에 오류와 코드가 있습니다. 무엇이 잘못되었는지, Visual Studio는 내 코드에서 아무 것도 강조하지 않았습니다. C++ 템플릿 오류?

unresolved external symbol

은 그들은 너무 작아 읽을의 경우 "확인되지 않은 외부 기호"를 말한다.

templated.h

template <class T> 
class numbers { 
public: 
    numbers(T x, T y); 
    T bigger(); 
private: 
    T a, b; 
}; 

templated.cpp

#include "templated.h" 
#include <iostream> 
using namespace std; 

template <class T> 
numbers<T>::numbers(T x, T y) { 
    a = x; 
    b = y; 
} 

template <class T> 
T numbers<T>::bigger() { 
    return a > b ? a : b; 
} 

MAIN.CPP

#include <iostream> 
#include "templated.h" 
using namespace std; 

int main() { 

    numbers <int>pair(1, 2); 
    cout << pair.bigger() << endl; 

    return 0; 
} 
읽는

감사합니다!

답변

3

cpp/c 파일에 템플릿 구현을 지정하지 않아도됩니다. 모든 파일을 .h 파일로 이동하십시오.

이것은 cpp 파일이 구현 라이브러리 (예 : dll 파일 또는 컴파일 된 객체)로 컴파일되는 기능을 갖고 있기 때문에 템플릿 함수에 정의되지 않은 유형 (아직 있음)이 있습니다. 유형은 컴파일 타임에 정의됩니다.

그러나 컴파일 된 개체에 포함 할 형식을 지정하는 cpp 파일에 템플릿 함수의 특수 효과를 넣을 수는 있습니다.

+0

오케이, 그래서 함수가 취하는 데이터 유형을 지정하지 않으면 템플릿 클래스 함수 구현을 별도의 파일에 넣을 수 없습니다. 그게 맞습니까? –

+0

사용할 모든 유형의 클래스를 인스턴스화하면 cpp 파일에 템플릿 클래스가 구현됩니다. 함수와 동일합니다. –

+0

오, 템플릿 기반 클래스에 .h 파일을 사용하지 않아야합니까? –