6

フレンドテンプレート関数を備えたテンプレートクラスがあります。私は現在次のコードを持っていて、それは機能しています:

template<class T>
class Vector
{
  public:
    template<class U, class W>
    friend Vector<U> operator*(const W lhs, const Vector<U>& rhs);
}

template<class U, class W>
Vector<U> operator*(const W lhs, const Vector<U>& rhs)
{
  // Multiplication
}

私のソリューションでは、現在の方法と比較してセキュリティ上の利点と1対1の対応を提供できるように、フレンド関数の前方宣言を使用することをお勧めします。次のことを試しましたが、エラーが発生し続けます。

template<class T>
class Vector;

template<class T, class W>
Vector<T> operator*(const W lhs, const Vector<T>& rhs);

template<class T>
class Vector
{
  public:
    friend Vector<T> (::operator*<>)(const W lhs, const Vector<T>& rhs);
}

template<class T, class W>
Vector<T> operator*(const W lhs, const Vector<T>& rhs)
{
  // Multiplication
}
4

1 に答える 1

3

私はあなたがほとんどそれを持っていたと思います。友だちになったときに、関数を単一のパラメーターテンプレートにする必要がありました。以下はg++4.5でコンパイルされますが、テストケースでインスタンス化をテストできないため、実際の問題が解決されるかどうかは100%わかりません。

template<class T>
class Vector;

template<class T, class W>
Vector<T> operator*(const W lhs, const Vector<T>& rhs);

template<class T>
class Vector
{
  public:
    template<class W>
    friend Vector<T> operator*(const W lhs, const Vector<T>& rhs);
};

template<class T, class W>
Vector<T> operator*(const W lhs, const Vector<T>& rhs)
{
  // Multiplication
}
于 2013-02-28T01:10:36.080 に答える