我如何才能写出一个特定的输出运算符友元函数呢?
#include <iostream>
using namespace std;
template <class T>
class num
{
public:
num(T a){m=a;}
friend ostream & operator << <T> (ostream &out, const num<T> &t)
{
out<<t.m<<endl;
return out;
}
private:
T m;
};
template<>
ostream & operator << <char> (ostream &out, const num<char> &t)
{
out<<t.m<<endl;
return out;
}
int main()
{
num<char> a('a');
cout<<a;
return 0;
}
写了根本编译不通过,咋回事捏。
[解决办法]
不对吧
template < typename U >
ostream & operator << (ostream & out, const num<U> & t);
的所有实例都是
num<int>
的友元函数
这也就有了
template <>
operator << <char> (ostream & out, const num<char> & t);
是
num<int>
的友元函数
也即可以修改num<int>对象的m了
[解决办法]
2L方法的测试
#include <iostream>
using namespace std;
template< typename t >
class num;
template< typename T >
ostream & operator << (ostream &out, const num<T> &t);
template <class T>
class num
{
public:
num(T a)
{
m=a;
}
friend ostream & operator << <T>(ostream &out, const num< T > &t);
private:
T m;
};
template< typename T >
ostream & operator << (ostream &out, const num<T> &t)
{
out << "T " << t.m << endl;
return out;
}
template< >
ostream & operator << < char > (ostream &out, const num< char > &t)
{
out<< "char " << t.m <<endl;
num<int> i(0);
// i.m = 1; // 当前模式, 不能有这句
return out;
}
int main(int argc, char * argv[])
{
num<int> i(0);
num<char> c('a');
cout << i << c;
return(0);
}
12L方法的测试:
#include <iostream>
using namespace std;
template <class T>
class num
{
public:
num(T a) : m(a)
{
}
template < typename U >
friend ostream & operator << (ostream & out, const num<U> & t);
private:
T m;
};
template < typename U >
ostream & operator << (ostream & out, const num<U> & t)
{
out << "U " << t.m << endl;
return out;
}
template < >
ostream & operator << <char> (ostream & out, const num<char> & t)
{
out << "char " << t.m << endl;
num<int> i(0);
i.m = 1; // 当前模式, 可以有这句
return out;
}
int main()
{
num<int> i(0);
num<char> c('a');
cout << i << c;
return(0);
}