Searching for the title of this question gives me a number of people quoting the same error, but under different circumstances, and unfortunately the answers there provided are
FIRST PROBLEM:
To make your program compile, just use an lvalue reference to const
as the second parameter of your operator <<
(both in the friend
-declaration and in the definition of that function):
template < class U, unsigned int M >
std::ostream& operator<< ( std::ostream &out, Vector< U, M > const& cVector )
// ^^^^^
The reason why your program won't compile is that your overload of operator <<
accepts an lvalue reference to non-const
as its second argument, and lvalue references to non-const
cannot bind to rvalues.
Since the result of operator +
between two instances of Vector
is a temporary, and a temporary is an rvalue, the compiler can't invoke your operator <<
, and is therefore unable to resolve the call.
SECOND PROBLEM:
Once you fixed the above issue, you'll have to solve a second one: your Vector
class template does not provide a const
version of operator []
, so your rewritten operator <<
, which now accepts a reference to a const
vector, won't be able to access the vector's elements.
template < class T, unsigned int N >
class Vector
{
// ...
T& operator[] ( const unsigned int& );
T const& operator[] ( const unsigned int& ) const; // <== ADD THIS!
// ...
};
And of course the corresponding definition:
template < class T, unsigned int N >
T const& Vector< T, N >::operator[] ( const unsigned int &index ) const
{
return _values[ index ];
}
Change this:
std::ostream& operator<< ( std::ostream&, Vector< U, M >& );
to this:
std::ostream& operator<< ( std::ostream&, const Vector< U, M >& );
// ^^^^^
The compiler is telling you that C++ will not let you bind a temporary Vector
such as u + v
to a non-const Vector&
.
And you don't modify that Vector
, so it should be const
to begin with.