Search code examples
classtemplatesoperator-overloadingfriend

Outputing an object through a template class member function


I'm trying to use a simple output function of the class template indexedList with an object of a simple class. I've overloaded the output operator in the class as a friend function as follows:

//in header file
friend ostream& operator <<(ostream&, simpleClass&);  

//in implementation file 
ostream& operator <<(ostream& out, simpleClass& c1){
out << c1.stringDataMem;            
return out;
}

It works fine on its own, but when I try to use it with the class template indexedList the compiler gives an error. Here is the output function in the class template:

//in header file
void display() const;  

//in implementation file
void indexList<T, maxSize>::display() const{
for (int i = 0; i < size; i++)
    cout << elements[i] << endl;
}

In the driver, I simply append a few objects of simpleClass into the "elements" array of a simpleClass indexedList, and try to use the display() function. This is the only error message I get:

"IndexList.cpp", line 38: Error: Formal argument 2 of type simpleClass& in call
to_operator<<(std::basic_ostream<char, std::char_traits<char>>&, simpleClass&)
requires an lvalue.

Both the class template and the simple class work well on their own but combining them does not. Any help would be greatly appreciated!


Solution

  • Not familiar with 'indexList', but as display() is a const method, elements[i] is likely returning a const simpleClass &, and thus you're trying to drop the const qualifier in your call to operator << ().

    Try having operator << () take a const reference.