Overloading friend operator << for template class
c++, operators
Solution
You declare operator<< as returning an ostream&, but there is no return statement at all in the method. Should be:
template <class T, class U>
ostream& operator<<(ostream& out, Pair<T,U>& v)
{
return out << v.val1 << " " << v.val2;
}
Other than that, I have no problems or warnings compiling your code under Visual Studio 2008 with warnings at level 4. Oh, there are the classical linker errors, but that is easily bypassed by moving the template function definition to the class declaration, as explained in the C++ FAQ.
My test code:
#include <iostream>
using namespace std;
template <class T, class U>
class Pair{
public:
Pair(T v1, U v2) : val1(v1), val2(v2){}
~Pair(){}
Pair& operator=(const Pair&);
friend ostream& operator<<(ostream& out, Pair<T,U>& v)
{
return out << v.val1 << " " << v.val2;
}
private:
T val1;
U val2;
};
int main() {
Pair<int, int> a(3, 4);
cout << a;
}
Problem
I'm trying to overload the operator << as a friend to a template class Pair, but I keep getting a compiler warning saying ``` friend declaration std::ostream& operator<<(ostream& out, Pair<T,U>& v) declares a non template function ``` for this code: ``` friend ostream& operator<<(ostream&, Pair<T,U>&); ``` it gives a second warning as a recommendation saying ``` if this is not what you intended, make sure the function template has already been declared and add <> after the function name here ``` Here is the function definition ``` template <class T, class U> ostream& operator<<(ostream& out, Pair<T,U>& v) { out << v.val1 << " " << v.val2; } ``` and here is the whole class. ``` template <class T, class U> class Pair{ public: Pair(T v1, U v2) : val1(v1), val2(v2){} ~Pair(){} Pair& operator=(const Pair&); friend ostream& operator<<(ostream&, Pair<T,U>&); private: T val1; U val2; }; ``` I wasn't sure what to draw from the recommendation warning, other than that maybe I have to put somewhere in the friend declaration. Does anyone know the proper syntax for this? Thanks.