关于模板化操作符重载函数的问题
关于模板化操作符重载函数的问题我自定义了结构体A和B,然后直接重载输出操作符template <class T>
ostream & operator << (ostream& os, T& _T)
{
os << "Struct Size = " << sizeof (T) << endl;
return os;
}
这样的函数该如何显式地调用呢? ( cout <A> << a; cout << <A> a 都不可以)
如果我直接用cout << a; //a是A的一个实例
它就会直接调用我定义的这个模板函数了,这很奇怪哦!
而如果我再加一个特化的函数:
ostream & operator << (ostream& os, A& a)
{
os << a.name << setfill('-') <<setw(5) << a.place << setfill('-') <<setw(5) << a.id << endl;
return os;
}
它又会优先调用这个特例, 原来的模板函数却不调用了.
函数模板是可以隐式实例化的,所以楼主写cout << a;时,就会直接调用正确实例化的函数模板,这一点都不奇怪啊。函数模板就是这样用的嘛。
如果你一定要显式地调用,可以这样写:
operator<< <A> (cout, a);
不过这样很难看,对吧?
至于在你定义了普通函数operator<<(ostream&, A&);之后,cout << a;就不再使用函数模板了,这再正常不过了,普通函数优先于函数模板嘛。
页:
[1]