huckberry's Avatar, Join Date: Nov 2010
Newbie Member
Excuse me for poking a really old thread, but this is the most complete reference to template operator overloading I've found to date. My situation is very similar to the one in the example, except that instead of using Derived<T>& as the right hand side of the operator<<, I'm using Derived<T>::SubClass&. The error I'm getting from my compiler (M$ Visual Studio 2010) is this:

Code:
LinkedList.obj : error LNK2019: unresolved external symbol "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,struct LinkedList<int>::Element const &)"  referenced in function _main
1>LinkedList.exe : fatal error LNK1120: 1 unresolved externals
Here's the relevant definitions:
Code:
template <class Type> class LinkedList {
public:
	struct Element{
		friend ostream& operator<< ( ostream &output, const typename Element &E);
	};
};

template <typename Type>
ostream& operator <<(ostream& output, const typename LinkedList<Type>::Element& E){
I've changed the definition of friend ostream& opertor << to include the <> however then I receive a different error, which makes me think that Visual Studio wont allow this type of function:

Code:
linkedlist.cpp(38): error C2785: 'std::ostream &operator <<(std::ostream &,const LinkedList<Type>::Element &)' and '<Unknown>' have different return types
Any Idea why Visual Studio is comparing it to '<Unknown>'?
huckberry's Avatar, Join Date: Nov 2010
Newbie Member
Again, My apologies for poking an old thread.

The issue was (eventually) resolved by removing the class Element from within the class LinkedList and making Element a template class.

For future readers, Visual studio requires 'typename' in declarations and allows for the '<>' mentioned prior.

Code:
template < class Type > class Element {
public:
    Type Data;
    friend ostream& operator << <>( ostream &output, const typename Element<Type> &E);
}

template < class Type > class LinkedList {
public:
    Element<Type>&    operator[](int index);	 //For Left Hand Values
    const Element<Type>& operator[](int index) const; //For Right Hand Values
}

ostream& operator<<( ostream &output, const typename Element<Type>& E){
    return output << E.Data;
}

template <class Type> const typename Element<Type>& LinkedList<Type>::operator[](int index) const{
    Element<Type> Answer;
    //Logic Here
    return *Answer
}

int main(){
    LinkedList<int> Array1;
    //init and add memebers
    cout << Array1[0];
    return 0;
jpope19's Avatar, Join Date: Mar 2012
Newbie Member
jogojapan just saved me a lot of time. thanks bro!