2013-02-28 27 views
5

Ho una classe modello con una funzione modello amico. Al momento ho il seguente codice e sta funzionando:Inoltro dichiarazione di modello Funzione

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 
} 

io preferirei per il mio soluzione per avere dichiarazione anticipata della funzione amico in modo che io possa avere le prestazioni di sicurezza e one-to-one corrispondenza che fornisce rispetto al mio metodo attuale. Ho provato quanto segue, ma continuo a incorrere in errori.

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

non y utilizzare l'originale 'dichiarazione friend' –

+0

con la versione originale, tutte le istanze del modello di vettore sono amici con tutte le istanze del modello di operatore *. Preferirei la seconda soluzione in cui i Vettori non consentissero a tutte le diverse istanze dei modelli di essere amici. – noddy

risposta

3

Penso che ce l'abbiate quasi. Hai solo bisogno di rendere la funzione un modello a parametro singolo quando la ami. Il seguente documento è compilato su g ++ 4.5 anche se, poiché non posso testare l'istanziazione con il tuo caso di test, non sono sicuro al 100% che risolva il tuo vero problema.

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

Il codice viene compilato, [ma ha vinto 'link] (http://ideone.com/KIT4lV). La funzione amico e il modello funzione libera sono deduzioni diverse. – WhozCraig

+0

Ottengo lo stesso errore di WhozCraig usando il compilatore GNU. Funziona comunque su Visual Studio C++. – noddy

Problemi correlati