2013-02-28 25 views
5

Bir arkadaş şablonu işlevine sahip bir şablon sınıfım var. Şu anda aşağıdaki kodu var ve çalışıyor: Ben güvenlik avantajları ve sağladığı bire bir uygunlukta olduğu böylece benim çözüm arkadaşı fonksiyonunun ileri bildiriye sahip olmak içinŞablon İşlevi'nin İleri Bildirimi

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 
} 

ben tercih ediyorum benim şu anki yöntemle karşılaştırdım. Aşağıdakileri denedim ancak hatalarla çalışmaya devam ediyorum.

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

y orijinal sürümü ile özgün 'friend' deklarasyon –

+0

kullanmayın, Vector tüm şablon örneğinin bulunması * operatörün tüm şablon örneklemesi ile arkadaşlar. Vektörlerin tüm farklı şablon örneklemelerinin arkadaş olmasına izin vermeyeceği ikinci çözümü tercih ederim. – noddy

cevap

3

Sanırım neredeyse buna sahiptiniz. Sadece arkadaşınızı bu işleve tek bir parametre şablonu yapmalısınız. G ++ 4.5 ile ilgili derlemeler, test örneğinizle örneklemeyi test edemediğimden beri,% 100 emin değilim, gerçek sorununuzu çözecektir.

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

Kod derlenir, [ancak 'bağlantı' kazandı (http://ideone.com/KIT4lV). Arkadaş fonksiyonu ve serbest fonksiyon şablonu farklı kesintilerdir. – WhozCraig

+0

GNU derleyicisini kullanarak WhozCraig ile aynı hatayı alıyorum. Ancak Visual Studio C++ üzerinde çalışır. – noddy