• ベストアンサー

templateを使ったときの未解決の外部シンボルエラー

以下のプログラムを、Visual C++ 2008でビルドすると、 『error LNK2019: 未解決の外部シンボル "class A<double> __cdecl add(class A<double> const &,double const &)" (?add@@YA?AV?$A@N@@ABV1@ABN@Z) が関数 _main で参照されました。』 のエラーになります。 template < typename T > class A { private: T x, y; public: A( const T& xx, const T& yy ):x(xx),y(yy){} T getx() const {return x;} T gety() const {return y;} friend A<T> add( const A<T>&, const T& ); }; template < typename T > A<T> add( const A<T>& a, const T& z ){ return A(a.x+z, a.y+z); } /* 直前のテンプレートでこの関数を作ったつもりです A<double> add( const A<double>& a, const double& z){ return A<double>(a.x+z, a.y+z); } /**/ #include <iostream> int main() { A<double> a(1.0, 2.0); double z=3.0; std::cout << add(a,z).getx() << "\n"; } どう書けばよいのでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

friend A<T> add( const A<T>&, const T& ); ↓ template<typename T> friend A<T> add( const A<T>&, const T& ); ではいかがです?

akayoroshi
質問者

お礼

できました。ありがとうございました。

その他の回答 (1)

  • BLK314
  • ベストアンサー率55% (84/152)
回答No.2

以下のように修正しました template <typename T> class A { private: T x, y; public: A(const T& xx, const T& yy):x(xx),y(yy){}; T getx() const {return x;} T gety() const {return y;} template <typename T>friend A<T> add( const A<T>&, const T& ); }; template <typename T> A<T> add(const A<T>& a, const T& z) { return A<T>(a.x + z, a.y + z); } /* 直前のテンプレートでこの関数を作ったつもりです A<double> add( const A<double>& a, const double& z){ return A<double>(a.x+z, a.y+z); } /**/ #include <iostream> int main() { A<double> a(1.0, 2.0); double z=3.0; std::cout << add(a,z).getx() << "\n"; } これで少なくともビルドは通るはずです 修正点は 1)先ほど指摘されたfriend前にtemplate <typename T>を追加 2)add()内 return A ...でなく         return A<T>...とする 位です ソースで確認してください

akayoroshi
質問者

お礼

ビルドエラーが無くなり、正しく動きました。ありがとうございました。

関連するQ&A