2010-07-19 104 views

回答

2

要专门化模板,首先必须声明一个模板。

如果是免费的operator<<,则不需要模板;你可以重载它为您my_type类:

std::ostream& operator<<(std::ostream& strm, my_type obj); 

如果你的对象是不是在大小琐碎,你可能要考虑通过一个const引用传递,这样你流呢,你不要每次复制:

std::ostream& operator<<(std::ostream& strm, const my_type& obj); 

(从技术上可以明确专门的operator<<,但我不认为这是你想要或需要的东西。为了能够使用模板操作< <与平时< <语法。你需要制作模板专业化可从一个参数类型中推导出来。

E.g.

// template op << 
template< class T > 
std::ostream& operator<<(std::ostream&, const MyTemplClass<T>&); 

// specialization of above 
template<> 
std::ostream& operator<< <int>(std::ostream&, const MyTemplClass<int>&); 

+0

Charles请阅读我对GMan的回答所写的评论 – 2010-07-19 21:02:35

+0

@Davit Siradeghyan:如果你有一个模板,它是所有*类型的catch不用说,这几乎总是一个坏主意),那么你可以专门化它,但是对于你的特定类型来说,重载它仍然更简单,重载解析会选择一个非模板函数在函数模板上的精确匹配 – 2010-07-19 21:12:05

+0

与查尔斯一起,拥有一个完全通用的插入操作符似乎非常危险。 – GManNickG 2010-07-19 21:15:53

2

为什么不只是超负荷?

// no template <> 
std::ostream& operator<<(std::ostream& strm, my_type obj); 

当存在一个模板专攻你只专注。

您的参数应该可能是const my_type&,以避免不必要的副本。

+0

是的,我知道重载,我需要重载operator <<为一组类型,想象在操作符体内部,我正在检查某些T1,T2或t3的类型,为它们做一件事,为所有其他类型做另一件事 – 2010-07-19 21:01:24

+0

@Davit:如何而不是'想象',你张贴在他的问题更大的图片? :)我们得到的信息越多,答案就越好。 (换句话说:发布问题,而不是步) – GManNickG 2010-07-19 21:02:35

+0

这是我的代码 模板 的std :: ostream的和运营商<<(STD :: ostream的和STRM,常量牛逼&e); ,我想专攻operator <<用于一些不是POD类型的T1,T2和T3类型 – 2010-07-19 21:05:36