peakzhang 发表于 2008-4-20 13:33:03

关于模板化操作符重载函数的问题

关于模板化操作符重载函数的问题我自定义了结构体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;
}
它又会优先调用这个特例, 原来的模板函数却不调用了.

peakzhang 发表于 2008-4-20 13:33:23

函数模板是可以隐式实例化的,所以楼主写cout << a;时,就会直接调用正确实例化的函数模板,这一点都不奇怪啊。函数模板就是这样用的嘛。

如果你一定要显式地调用,可以这样写:

operator<< <A> (cout, a);

不过这样很难看,对吧?

至于在你定义了普通函数operator<<(ostream&, A&);之后,cout << a;就不再使用函数模板了,这再正常不过了,普通函数优先于函数模板嘛。
页: [1]
查看完整版本: 关于模板化操作符重载函数的问题