2012-04-11 20 views
0

私はさまざまなコンテキストで外部関数を呼び出す必要があるクラスを持っています。これまでのところテンプレートクラスとのリンクエラー

class MyClass { 
    public: 
    template <class T> 
    MyClass(T &f_) { f = f_; } 
    private: 
    int (*f)(int); 
}; 

int myFn(int i) { 
    return i % 100; 
} 

int main() { 
    MyClass test(myFn); 
    return 0; 
} 

:簡略化した例のように見えるなど、私は柔軟なものを維持したいので、私はファンクタで動作するはずです(数値レシピの第3版に触発)インタフェースを使用しています、関数ポインタとても良い; g ++はこれをコンパイルして何の苦情も出さない。私の本当のアプリケーションでは、もっと多くのコードがあるので、複数のファイルに分割されています。例えば、

test2.h:

#ifndef __test2__ 
#define __test2__ 

class MyClass { 
    public: 
    template <class T> 
    MyClass(T &f_);  
private: 
    int (*f)(int); 
}; 

#endif 

test2.cpp:

#include "test2.h" 

template <class T> 
MyClass::MyClass(T &f_) { 
    f = f_; 
} 

main.cppに:

#include "test2.h" 

int myFn(int i) { 
    return i % 100; 
} 

int main() { 
    MyClass test(myFn); 
    return 0; 
} 

私はこの使用してg++ test2.cpp main.cppをコンパイルしようとすると、I次のリンクエラーが発生します:

/tmp/ccX02soo.o: In function 'main': 
main.cpp:(.text+0x43): undefined reference to `MyClass::MyClass<int()(int)>(int (&)(int))' 
collect2: ld returned 1 exit status 

g ++は、私もtest2.cppをコンパイルしようとしていることに気づいていないようです。ここで何が起こっているのかについてのアイデアはありますか?

おかげで、

--craig

+0

[なぜテンプレートはヘッダのみファイルに実装することができますか?]の可能複製(http://stackoverflow.com/questions/495021:あなたはヘッダに実装を移動しなければならないことを意味

ヘッダーファイルに実装される理由テンプレート/テンプレートのみ) –

答えて

1

テンプレートクラスが、彼らは完全に特殊化されていない限り、それらを使用するすべての翻訳単位への実装が見えている必要があります。

//test2.h 
#ifndef __test2__ 
#define __test2__ 

class MyClass { 
    public: 
    template <class T> 
    MyClass(T &f_);  
private: 
    int (*f)(int); 
}; 

template <class T> 
MyClass::MyClass(T &f_) { 
    f = f_; 
} 

#endif