Define friend operator << for class template.

J

Joe Hesse

Hi,

I have a template class and I want to define an operator << as a friend
function. For each instantiation of the class I want a corresponding
instantiation of operator <<.
The following example fails to compile with g++ version 4.1.2.
I would appreciate it if you could help me fix it or point me to a suitable
reference.

Thank you,
Joe Hesse

********************************************
#include <iostream>

// forward declaration
template <typename T>
class Foo;

// forward declaration
template <typename T>
std::eek:stream & operator << (std::eek:stream &, const Foo<T> &);

template <typename T>
class Foo {
private:
T value;
public:
Foo(const T & v) : value(v) {}
friend std::eek:stream & operator << <> (std::eek:stream &, const Foo<T> &);
};

// implement operator <<
template <typename T>
std::eek:stream & operator << (std::eek:stream &o, const Foo<T> &f) {
return o << f.value ;
}

int main() {
Foo<int> fi;
std::cout << fi;

return 0;
}

/* Here are the compiler error messages
Test.cpp: In function int main():
Test.cpp:26: error: no matching function for call to Foo<int>::Foo()
Test.cpp:16: note: candidates are: Foo<T>::Foo(const T&) [with T = int]
Test.cpp:12: note: Foo<int>::Foo(const Foo<int>&)
*/

********************************************
 
J

Joe Hesse

Please forgive me, I have an obvious error. No response is needed from the
newsgroup.
 
T

terminator

Hi,

I have a template class and I want to define an operator << as a friend
function. For each instantiation of the class I want a corresponding
instantiation of operator <<.
The following example fails to compile with g++ version 4.1.2.
I would appreciate it if you could help me fix it or point me to a suitable
reference.

Thank you,
Joe Hesse

********************************************
#include <iostream>

// forward declaration
template <typename T>
class Foo;

// forward declaration
template <typename T>
std::eek:stream & operator << (std::eek:stream &, const Foo<T> &);

template <typename T>
class Foo {
private:
T value;
public:
Foo(const T & v) : value(v) {}
friend std::eek:stream & operator << <> (std::eek:stream &, const Foo<T> &);

};

// implement operator <<
template <typename T>
std::eek:stream & operator << (std::eek:stream &o, const Foo<T> &f) {
return o << f.value ;

}

int main() {
Foo<int> fi;
std::cout << fi;

return 0;

}

/* Here are the compiler error messages
Test.cpp: In function int main():
Test.cpp:26: error: no matching function for call to Foo<int>::Foo()
Test.cpp:16: note: candidates are: Foo<T>::Foo(const T&) [with T = int]
Test.cpp:12: note: Foo<int>::Foo(const Foo<int>&)
*/

********************************************

Instein says "take it simple, as simple as posible but not simpler".
Why did you not use the simplest imaginable syntax?
I would write:

friend std::eek:stream & operator << (std::eek:stream &, const Foo &);

but this is not what the compiler complaigns about;Please learn to
read:
Test.cpp:26: error: no matching function for call to Foo<int>::Foo()
Test.cpp:16: note: candidates are: Foo<T>::Foo(const T&) [with T = int]
Test.cpp:12: note: Foo<int>::Foo(const Foo<int>&)

Since you have defined a constructor ,C++ will no more automatically
generate a default constructor. this is the errorneous line:

Foo<int> fi;

In order to resolve this add the following inside the braces for
declaration of your template class:

Foo(){};

regards,
FM.
 
W

want.to.be.professer

Once you not provide a constructor ,There will be a default
constructor;
When you provide, There will be your provided constructor only;
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,756
Messages
2,569,535
Members
45,008
Latest member
obedient dusk

Latest Threads

Top