我想专门化运营商<<但是这段代码没有编译;
template<>
std::ostream& operator<< < my_type >( std::ostream& strm, my_type obj);
答案 0 :(得分:2)
为什么不过载?
// no template <>
std::ostream& operator<<( std::ostream& strm, my_type obj);
只有在存在 专门化的模板时,才会专攻。
您的参数应该是const my_type&
,以避免不必要的副本。
答案 1 :(得分: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<<
,但我不认为这是你想要或需要的。为了能够使用模板运算符&lt;&lt;与通常的&lt;&lt; ;您需要使用一种参数类型对模板特化进行推导的语法。
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>& );
)