我可以专门化运算符&lt; <! - ? - >

时间:2010-07-19 20:56:03

标签: c++ templates operator-overloading

我想专门化运营商&lt;&lt;但是这段代码没有编译;

template<>

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

2 个答案:

答案 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>& );