Re: Overloading << operator
* Christian:
Hi I have this code:
[CODE]
template <class T>
ostream& operator<< (ostream& output, Array<T>& theArray)
{
for (int i = 0; i<theArray.GetSize(); i++)
output << "[" << i << "] " << theArray[i] << endl;
}
[/CODE]
which is defined as:
[CODE]
template <class T> friend ostream& operator<< (ostream&, Array<T>&);
[/CODE]
By compiling the source code VS2005 tells me:
error C4716: 'operator<<<int>' : must return a value.
It seems as it can't recognize ostream& as a returned value. By
reading this article [1] it seems that there's nothing wrong in my
code,so what's the problem? Thanks.
You must return a value.
Read up on the 'return' statement in your favorite textbook.
FULL CODE:
#include "stdafx.h"
This is not a standard C++ header and is completely unnecessary.
#include <iostream>
using namespace std;
const int DefaultSize = 10;
template <class T> // declare the template and the parameter
class Array // the class being parameterized
{
public:
// constructors
Array(int itsSize = DefaultSize);
Array(const Array &rhs);
~Array() { delete [] pType; }
// operators
Array& operator=(const Array&);
T& operator[](int offSet) { return pType[offSet]; }
const T& operator[](int offSet) const { return pType[offSet]; }
// accessors
int GetSize() const { return itsSize; }
template <class T> friend ostream& operator<< (ostream&, Array<T>&);
private:
T *pType;
int itsSize;
};
Check out the std::vector class, it's standard and does the job much
better, and also is compatible with the rest of the standard library.
template <class T>
ostream& operator<< (ostream& output, Array<T>& theArray)
{
for (int i = 0; i<theArray.GetSize(); i++)
output << "[" << i << "] " << theArray[i] << endl;
}
// implementations follow...
// implement the Constructor
template <class T>
Array<T>::Array(int size = DefaultSize):
itsSize(size)
{
pType = new T[size];
for (int i = 0; i<size; i++)
pType[i] = 0;
The initialization loop is unnecessary ('new' does that for you if you
tack on '()' at the end) but anyway, if you choose the loop thing,
perhaps for clarity, or perhaps because g++ doesn't Do It Right, the
loop body should be "pType[i] = T();".
}
// copy constructor
template <class T>
Array<T>::Array(const Array &rhs)
{
itsSize = rhs.GetSize();
pType = new T[itsSize];
for (int i = 0; i<itsSize; i++)
pType[i] = rhs[i];
Here you needed the same loop again.
Consider a member function.
}
// operator=
template <class T>
Array<T>& Array<T>::operator=(const Array &rhs)
{
if (this == &rhs)
return *this;
delete [] pType;
itsSize = rhs.GetSize();
pType = new T[itsSize];
What if this throws?
for (int i = 0; i<itsSize; i++)
pType[i] = rhs[i];
return *this;
}
Try to google for the swap idiom for implementing operator=.
It's much simpler, and exception safe.
void main()
'main' must always have result type 'int'.
Repeating earlier advice:
Check out the std::vector class, it's standard and does the job much
better, and also is compatible with the rest of the standard library.
Cheers, & hth.,
- Alf
--
A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?