1

次のように「display」メソッドをオーバーロードしようとしています。

template <typename T> void imShow(T* img, int ImgW, int ImgH);
template <typename T1, typename T2> void imShow(T1* img1, T2* img2, int ImgW, int ImgH);

次に、unsigned char*im1およびchar*im2を使用してテンプレートを呼び出しています。

imShow(im1, im2, ImgW, ImgH);

これは正常にコンパイルされますが、次のリンクエラー「未解決の外部シンボル」が表示されます。

imShow<unsigned char,char>(unsigned char *,char *,int,int)

何が悪かったのかわかりません!

4

2 に答える 2

2

コンパイラに「エクスポート」テンプレート機能がない場合は、ヘッダーファイルでそのテンプレートを定義する必要があります(EDGフロントエンドに基づくコンパイラのみにあり、GCCとMSVCにはありません)。または、.cppファイルで関数テンプレートを明示的にインスタンス化することもできます(その定義をそこに配置した場合)。

template void imShow(unsigned char* img1, char* img2, int ImgW, int ImgH);

しかし、そのように明示的にインスタンス化されていない別のタイプのペアを渡すとすぐに、リンクに失敗します。したがって、関数テンプレートの定義をヘッダーに入れる必要があります。これにより、コンパイラは関数を呼び出すときにそれを認識し、関数自体のコピーをインスタンス化します。

于 2010-04-23T14:32:55.033 に答える
1

テンプレート関数を正しく定義するのを忘れた可能性があります。定義はどこにありますか?あなたの投稿には何も表示されません。

于 2010-04-23T14:33:01.423 に答える