我可以专门化运算符<<吗?

发布于 2024-09-10 16:22:19 字数 169 浏览 5 评论 0 原文

我想专门化运算符<<但这段代码无法编译;

template<>

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

I want to specialize operator<< but this code is not compiling;

template<>

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

独行侠 2024-09-17 16:22:19

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

对于免费的operator<<,您不需要模板;你可以为你的 my_type 类重载它:

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

如果你的对象大小不小,你可能需要考虑通过 const 引用传递,这样你就不会在每次流式传输时复制它:

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

(从技术上讲,您可以显式地专门化一个运算符<<,但我认为这不是您想要或需要的。为了能够将模板运算符<<与 语法需要使模板专业化可以从参数类型之一推导出来

// 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>& );

通常的<<

To specialize a template, first you have to have a template declared.

In the case of a free operator<< you don't need a template; you can just overload it for your my_type class:

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

If your object isn't trivial in size, you may want to consider passing via a const reference so that you don't copy it every time you stream it:

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

(Technically you can explicitly specialize an operator<<, but I don't think that this is what you want or need. In order to be able to use a template operator<< with the usual << syntax you need to make the template specialization deducible from one of the parameter types.

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

)

海之角 2024-09-17 16:22:19

为什么不只是超载呢?

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

仅当存在专门化的模板时,您才可以专门化。

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

Why not just overload?

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

You only specialize when there exists a template to specialize.

Your parameter should probably be const my_type&, to avoid a needless copy.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文