2011-02-01 5 views
2

모든 소스를 하나의 파일에 넣으면 프로그램이 성공적으로 빌드됩니다. 그러나 헤더 파일로 분할하면 링크 오류가 발생합니다.C++에서 다른 파일에있는 템플릿을 컴파일하는 방법은 무엇입니까?

내 프로그램의 주요 : //C++_Class_Templates.cpp

#include <iostream> 
#include <vector> 
#include "Queue.h" 

using namespace std; 

//Usage for C++ class templates 
void main() 
{ 
    MyQueue<int> q; 
    q.Add(1); 
    q.Add(2); 
} 

Queue.h이

#pragma once 
#include <vector> 

template <typename T> 
class MyQueue 
{ 
    std::vector<T> data; 
    public: 
    void Add(T const &); 
    void Remove(); 
    void Print(); 

}; 

같은 외모와 Queue.cpp은 다음과 같습니다

#include "Queue.h" 

template <typename T> void MyQueue<T> ::Add(T const &d) 
{ 
    data.push_back(d); 
} 

빌드 할 때이 오류가 발생합니다.

1>main.obj : error LNK2019: unresolved external symbol "public: void __thiscall 
MyQueue<int>::Add(int const &)" ([email protected][email protected]@@[email protected]) referenced in function _main 
+0

어떻게 컴파일하나요? – Falmarri

+0

"헤더 파일로 분할하지 않았습니다". 여러 ** 구현 ** 파일로 나뉘어 필요할 때 템플릿 정의를 사용할 수 없도록 만듭니다. –

+1

가능한 중복 링크 [템플릿을 사용하여 링크] (http://stackoverflow.com/questions/550219/link-error-using-templates) –

답변

11

짧은 대답은 "당신은하지 않습니다."

더 긴 대답은 : 음, 기본적으로 짧은 대답과 같습니다. 자세한 내용은 C++ FAQ Lite 항목 "Why can't I separate the definition of my templates class from its declaration and put it inside a .cpp file?"을 참조하십시오. 특정 제한된 시나리오를 제외하고 (예 : 템플릿을 사용할 알려진 인수 집합이 적고 해당 유형으로 명시 적으로 인스턴스화 할 수있는 경우), 템플릿을 사용하려고 할 때 템플릿을 사용할 수 있어야합니다.

1

템플릿에 대한 선언 및 정의를 구분하는 것은 쉬운 일이 아닙니다.

컴파일러는 전문화를 컴파일하려면 정의를 확인해야하지만 사용할 매개 변수도 알아야합니다. C++은 한 번에 하나의 "컴파일 단위"로 컴파일되도록 설계되었으며이 두 부분 (정의 및 매개 변수)은 동시에 볼 수 있어야합니다.

따라서 템플릿의 구현 파일에 필요한 모든 전문화 목록을 넣거나 전체 정의를 .h 파일에 넣으십시오. 그러나 두 가지 솔루션 모두 단점이 있습니다.

보다 완벽한 설명을 위해 직면 한 동일한 문제에 대해 this answer을 참조하십시오.

관련 문제