2013-02-28 8 views
5

私は、テンプレートテンプレート関数を持つテンプレートクラスを持っています。私は現在、次のコードを持っており、それが働いている:テンプレート関数の前方宣言

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 
} 
+1

オリジナルの「friend」宣言を使用しない –

+0

元のバージョンでは、Vectorのすべてのテンプレートインスタンス化は、演算子*のすべてのテンプレートインスタンス化を持つフレンドです。私はベクトルがすべての異なるテンプレートインスタンス化を友人にすることを許さない第2の解決法を好むだろう。 – noddy

答えて

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 
} 
+0

コードはコンパイルされますが、[リンク](http://ideone.com/KIT4lV)になります。フレンド関数とフリー関数テンプレートは異なる控除です。 – WhozCraig

+0

私はGNUコンパイラを使ってWhozCraigと同じエラーを受け取ります。しかし、Visual Studio C++でも動作します。 – noddy