找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 5605|回复: 1

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

[复制链接]
发表于 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;
}
它又会优先调用这个特例, 原来的模板函数却不调用了.
 楼主| 发表于 2008-4-20 13:33:23 | 显示全部楼层
函数模板是可以隐式实例化的,所以楼主写cout << a;时,就会直接调用正确实例化的函数模板,这一点都不奇怪啊。函数模板就是这样用的嘛。

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

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

不过这样很难看,对吧?

至于在你定义了普通函数operator<<(ostream&, A&);之后,cout << a;就不再使用函数模板了,这再正常不过了,普通函数优先于函数模板嘛。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-21 21:31 , Processed in 0.015570 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表