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