乗算演算子を TVector3 という名前のテンプレート クラスのフレンドにしようとしています。クラス宣言で宣言する前に、フレンド関数の前方宣言を行うことができると読みましたが、そうしようとしても無駄でした。フレンド関数を宣言する代わりに単純に定義できることはわかっていますが、前方宣言手法で機能させたいと考えています。
特に、私は自分の場合にこのソリューションを実装しようとしていました。David Rodriguez が解決策 (3 番目のバージョン) を提供しているこの投稿も見つかりましたが、何が間違っているのかわかりません。
「 g++ template.cpp tempmain.cpp a 」を使用してコンパイルすると、コンパイラ (g++) は次のエラーを返します。
「ray::TVector3 ray::operator*(float, ray::TVector3 const&)」への未定義の参照
次のコードの場合:
template.h:
#ifndef TVECTOR_H
#define TVECTOR_H
#include <cmath>
namespace ray
{
//forward declarations
template <class T> class TVector3;
template <class T> TVector3<T> operator* (T, const TVector3<T> &);
template <class T>
class TVector3 {
public:
union {
struct {
T x, y, z;
};
T xyz[3];
};
//function needed
friend TVector3<T> operator*<T> (T, const TVector3<T> &);
};
}
#endif
テンプレート.cpp:
#include "template.h"
using namespace ray;
//friend operator function
template<class T> TVector3<T> operator * (T f, const TVector3<T> &v)
{
return TVector3<T>(f * v.x, f * v.y, f * v.z);
}
//instantiate template of type float
template class TVector3<float>;
tempmain.cpp:
#include <iostream>
#include "template.h"
int main()
{
ray::TVector3<float> v1, v2;
v2.x = 3;
v1 = 4.0f * v2; //this reports as undefined
std::cout << v1.x << "\n";
return 0;
}
それが完全なソースコードです。私は何を間違っていますか?