2010-11-23 29 views
2

テンプレート定義を別々のヘッダファイルに取得するにはどうすればよいですか?継承を使用する場合の未解決の参照

私のコードは、1つのmain.cppに含まれているとコンパイルされます。私はそれを破るとき

maip.cpp

#include <windows.h> 
#include <tchar.h> 

template<class T1, class T2> 
class Base { 
public: 
    virtual ~Base() {} 
    virtual T1 f1(); 
    virtual T2 f2(); 
}; 

template<class T1, class T2> 
T1 Base<T1, T2>::f1() {return T1();} 
template<class T1, class T2> 
T2 Base<T1, T2>::f2() {return T2();} 

class Derived : public Base<int, int> { 
public: 
    virtual ~Derived() {} 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int i; 
    Derived d; 
    i = d.f1(); 
    return 0; 
} 

はしかし、私は、未解決の外部シンボルを得る:

main.cppに

#include <windows.h> 
#include <tchar.h> 

#include "Base.h" 
#include "Derived.h" 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int i; 
    Derived d; 
    i = d.f1(); 
    return 0; 
} 

Base.h

#pragma once 

template<class T1, class T2> 
class Base { 
public: 
    Base(); 
    virtual ~Base() {} 
    virtual T1 f1(); 
    virtual T2 f2(); 
}; 

template<class T1, class T2> 
T1 Base<T1, T2>::f1() {return T1();} 
template<class T1, class T2> 
T2 Base<T1, T2>::f2() {return T2();} 

Derived.h

#pragma once 

class Derived : public Base<int, int> { 
public: 
    virtual ~Derived() {} 
}; 

これは、その結果:

エラー1つのエラーLNK2019:未解決の 外部シンボル "パブリック:__thiscall ベース::ベース(無効)" で参照される (?? 0?$ Base @ HH @@ QAE @ XZ)function "public:__thiscall Derived :: Derived(void)" (0Derived @@ QAE @ XZ)

+4

minorpoint: 'Derived.h'は' Base'から継承した 'Base.h'をインクルードする必要があります。クライアントに正確な順序でファイルをインクルードするように頼んでいるので、各ヘッダは自立していなければなりません。その前に何も入れずにコンパイルする必要があります)。 –

答えて

5

Baseのコンストラクタの実装は提供していません。追加してみてください

template<class T1, class T2> 
Base<T1, T2>::Base() { } 

また、その宣言を2番目のコードスニペットから削除することもできます。 (これは最初のコード例では表示されません)。

あなたのリンカーは、基本的にはDerived::Derived()が明示的に宣言したBase::Base()を呼び出しようとしていますが、その実装を見つけることはできません。