类内声明
friend ostream& operator<<(ostream& os,const store<T> &item);
类外实现
template <typename T>
ostream& operator<<(ostream &os,const store<T> &item)
{
os << item.value;
return os;
}
使用
http://i.cnblogs.com/EditPosts.aspx?postid=3606394store<int> a(5);
cout << a << endl;
编译出现错误:
undefine reference to 'opeartor<<(std::basic_ostream<char,std::char_traits<char> >&,store<int> const&)'
网上大部分的解决思路是GCC编译时通知链接器链接静态库libstdc++,或者直接用g++编译,可是我本身就用的g++编译的啊
通过http://www.cnblogs.com/xkfz007/articles/2534322.html,找到解决方案
在类模板中重载输入和输出操作符,若是用友元在类内声明,在类外实现,链接时将会报错,可以采用以下三种方式实现输入输出操作符重载:
(一)
直接在类内实现
如果在类外实现,
template<typename T>
ostream& operator<<(ostream& os,store<T> &item)
{
os << item.value;
return os;
}
正好是函数模板的定义,因为重载操作符<<函数不是类的成员函数,所以这里相当与定义了新的函数模板,就不同与类中的声明(friend ostream& operator<<(ostream&,const store<T>&))。但是去掉template <typename T>,函数参数表中的T将不知类型,这个矛盾决定不能类内声明,类外实现
(二)
类外实现相当与定义了一个函数模板,则它不使用类的私有成员即可。通过类的公有成员实现对类的私有成员的操作。因此可以不再类内声明为友元,直接在类外实现重载
由于访问了私有成员value,可以为类实现一个public函数getValue,类外使用 os << item.getValue()即可
(三)使用过渡函数