2013-02-28 14 views
5

Mam szablon klasy z funkcją szablonu znajomego. Obecnie mam następujący kod i to działa:Forward Declaration of Template Function

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 
} 

wolałbym na moje rozwiązanie, aby do przodu deklarację funkcji znajomemu tak, że mogę mieć korzyści zabezpieczeń i jeden do jednego korespondencji, która zapewnia w porównaniu do mojej obecnej metody. Próbowałem następujących rzeczy, ale wciąż mam błędy.

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 nie używać oryginalnego 'friend' deklarację –

+0

z oryginalną wersją, wszystkie dawałaby szablonu wektora są przyjaciółmi ze wszystkimi dawałaby szablonów od operatora *. Wolałbym drugie rozwiązanie, w którym Wektory nie pozwoliłyby przyjaciołom wszystkich różnych instancji szablonów. – noddy

Odpowiedz

3

Myślę, że prawie go masz. Po prostu musisz ustawić funkcję pojedynczego szablonu parametru, gdy go zaprzyjaźnisz. Następujące kompilacje dotyczą g ++ 4.5, ale ponieważ nie mogę przetestować instancji w teście, nie jestem w 100% pewien, czy rozwiąże on twój prawdziwy problem.

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 kompiluje, [ale wygrał "link] (http://ideone.com/KIT4lV). Funkcja przyjaciela i szablon bezpłatnej funkcji to różne odliczenia. – WhozCraig

+0

Otrzymuję ten sam błąd co WhozCraig przy użyciu kompilatora GNU. Działa jednak na Visual Studio C++. – noddy