0

特殊なクラス メンバー関数を使用しようとしています。ここの 1 つの投稿で次の解決策を見つけましたが、うまくいきません。ソリューションをビルドすると、次のエラーが表示されます。 - TestClass.obj : エラー LNK2005 および致命的なエラー LNK1169。コードの何が問題になっていますか?

template <class T1, class T2>
class TestClass
{
    private:
    VD cdata;
    public:
    TestClass(void){}; 
    TestClass(VD & edata);
    T1 fun1(const T2 ex);
    ~TestClass(void);
};

  template <class T1, class T2>
  T1 TestClass<T1, T2>::fun1(const T2 x)
  {
     T1 v1 = 100.0*pow(x[1] - x[0]*x[0],2) + pow(1 - x[0],2);
     return v1;
  }


 template <>
 double TestClass<double, column_vector>::fun1(const column_vector x)
 {
    double v1 = 100.0*pow(x(1) - x(0)*x(0),2) + pow(1 - x(0),2);
    return v1;
 }
4

1 に答える 1

1

明示的に特殊化された (完全に特殊化された) テンプレート関数は、ODR 目的の通常の関数です。これは、ヘッダー ファイルで特殊化を定義せずに宣言する必要があることを意味します。

template <>
double TestClass<double, column_vector>::fun1(const column_vector x);

そして、それをいくつかの.cppファイルで定義します

template <>
double TestClass<double, column_vector>::fun1(const column_vector x)
{
  double v1 = 100.0*pow(x(1) - x(0)*x(0),2) + pow(1 - x(0),2);
  return v1;
}

定義全体をヘッダー ファイルに入れたため、複数定義エラー (LNK1169) が発生しました。

LNK2005 に関しては...もっと情報を提供する必要があります。あなたが投稿した内容から、誰が LNK2005 を引き起こしたのかは明らかではありません。LNK2005 で言及されている機能はどれですか?

于 2013-06-15T19:42:10.430 に答える