2

クラスのヘッダー ファイルは次のとおりです。

 enum class My_Type {
     type1,
     type2
 };

 template <int dim>
 class My_Class {
 public:
     My_Class() {};

     template <My_Type p_type>
     void
     func();
 }

cpp ファイル:

template <int dim>
template <My_Type p_type>
void
My_Class<dim>::func() {
     if (p_type==My_Type::type1) {
         ...
     } else {
         ...
     }
     ....
}

呼び出しは次のとおりです。

My_Class<2> my_obj;
my_obj.template func<My_Type::type1>();

すべてが正常にコンパイルされますが、リンクされません:

'Undefined symbols for architecture x86_64'

これは、コードの一部がライブラリ内にあるためです。したがって、明示的にインスタンス化する必要があります。

クラスの場合、これは明らかです。

 template class My_Class<2>;

問題は、そのような場合にテンプレート化された関数をどのようにインスタンス化するかです。トリックや回避策はありますか?

p/s/ からわかるenumように、問題があれば C++11 を使用します。

p/p/s/ いくつかのリンクを調べましたが、解決策を見たかどうかはわかりません。

4

1 に答える 1

0

面白いことに、試行錯誤の末、正しい構文を導き出しました。

template class MyClass<2>;
template void MyClass<2>::func< My_Type::type1>();
template void MyClass<2>::func< My_Type::type2>();
于 2013-06-04T12:53:58.753 に答える