Reputation: 8551
Friend functions should be able to access a class private members right? So what have I done wrong here? I've included my .h file with the operator<< I intent to befriend with the class.
#include <iostream>
using namespace std;
class fun
{
private:
int a;
int b;
int c;
public:
fun(int a, int b);
void my_swap();
int a_func();
void print();
friend ostream& operator<<(ostream& out, const fun& fun);
};
ostream& operator<<(ostream& out, fun& fun)
{
out << "a= " << fun.a << ", b= " << fun.b << std::endl;
return out;
}
Upvotes: 10
Views: 12417
Reputation: 263360
You can avoid these kinds of errors by writing the friend function definition inside the class definition:
class fun
{
//...
friend ostream& operator<<(ostream& out, const fun& f)
{
out << "a= " << f.a << ", b= " << f.b << std::endl;
return out;
}
};
The downside is that every call to operator<<
is inlined, which might lead to code bloat.
(Also note that the parameter cannot be called fun
because that name already denotes a type.)
Upvotes: 0
Reputation: 147056
The signatures don't match. Your non-member function takes fun& fun, the friend declared on takes const fun& fun.
Upvotes: 6
Reputation: 22084
In here...
ostream& operator<<(ostream& out, fun& fun)
{
out << "a= " << fun.a << ", b= " << fun.b << std::endl;
return out;
}
you need
ostream& operator<<(ostream& out, const fun& fun)
{
out << "a= " << fun.a << ", b= " << fun.b << std::endl;
return out;
}
(I've been bitten on the bum by this numerous times; the definition of your operator overload doesn't quite match the declaration, so it is thought to be a different function.)
Upvotes: 13