我想专门运营商< <但这个代码不编译;可以专门运营商<<?
template<>
std::ostream& operator<< <my_type>(std::ostream& strm, my_type obj);
我想专门运营商< <但这个代码不编译;可以专门运营商<<?
template<>
std::ostream& operator<< <my_type>(std::ostream& strm, my_type obj);
要专门化模板,首先必须声明一个模板。
如果是免费的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>&);
)
Charles请阅读我对GMan的回答所写的评论 – 2010-07-19 21:02:35
@Davit Siradeghyan:如果你有一个模板,它是所有*类型的catch不用说,这几乎总是一个坏主意),那么你可以专门化它,但是对于你的特定类型来说,重载它仍然更简单,重载解析会选择一个非模板函数在函数模板上的精确匹配 – 2010-07-19 21:12:05
与查尔斯一起,拥有一个完全通用的插入操作符似乎非常危险。 – GManNickG 2010-07-19 21:15:53
为什么不只是超负荷?
// no template <>
std::ostream& operator<<(std::ostream& strm, my_type obj);
当存在一个模板到专攻你只专注。
您的参数应该可能是const my_type&
,以避免不必要的副本。
是的,我知道重载,我需要重载operator <<为一组类型,想象在操作符体内部,我正在检查某些T1,T2或t3的类型,为它们做一件事,为所有其他类型做另一件事 – 2010-07-19 21:01:24
@Davit:如何而不是'想象',你张贴在他的问题更大的图片? :)我们得到的信息越多,答案就越好。 (换句话说:发布问题,而不是步) – GManNickG 2010-07-19 21:02:35
这是我的代码 模板
为什么模板? – kennytm 2010-07-19 20:58:24