0

次のエラーが発生しました。

features.cpp:(.text+0x4f6): undefined reference to `void Convolve<float>(CImageOf<float>, CImageOf<float>&, CImageOf<float>)'

そこで、features.cpp ファイルに次のヘッダー ファイルを追加しました。内容は次のとおりです。

template <class T>
void Convolve(CImageOf<T> src, CImageOf<T>& dst,
              CFloatImage kernel);

これをubuntu 64bitのGCCでコンパイルしています。上記のエラーは、ヘッダーの内容が参照と一致しないことが原因であることに気付きましたが、それはテンプレートが原因であるため、この問題が発生するはずはありませんか? 他に何が起こっているのですか?

畳み込みの呼び出しを再確認しましたが、実際にはこれが私が使用しているタイプです:

Convolve(CFloatImage, CFloatImage, CFloatImage); 

上記のエラーへの参照が実際には見つかりません

4

2 に答える 2

4

関数テンプレートを .cpp ファイルに入れて別の翻訳単位で使用する場合は、テンプレートを明示的にインスタンス化する必要があります。たとえば、次のようになります。

template
void Convolve<float>(
   CImageOf<float> src,
   CImageOf<float>& dst,
   CFloatImage kernel);

基本的に、コンパイラはその定義を確認した場合にのみテンプレートをインスタンス化できます。テンプレートを自動的にインスタンス化する場合は、ヘッダーで定義する必要があります。

于 2012-09-22T18:16:36.537 に答える
0

OPとのチャットで判明したように、問題はおそらく正しくリンクされていないMakefileにありました。

定義はありませんでしたが、.h ファイルにはテンプレートの宣言がありました (何人かが示唆したように)。OPが用語を混乱させたと思います。

Convolve<float>ただし、.cpp ファイルには、インスタンス化された (およびその他の)関数定義 (非テンプレート) とともにテンプレートの定義がありました。

繰り返しますが、コードは正しかったのですが、ビルド ルーチンが正しくありませんでした。

于 2012-09-23T09:06:39.633 に答える