我定义了以下函数:
template <typename T> buffer_t &operator<<(buffer_t &buffer, T data);
template <> buffer_t &operator<<(buffer_t &buffer, const char *data);
template <> buffer_t &operator<<(buffer_t &buffer, const Glib::ustring &data);
当我打电话时:
buffer << Glib::ustring("hello");
编译器使用通用模板定义而不是特化Glib::ustring
.
我在这里做错了什么?
template <typename T> buffer_t &operator<<(buffer_t &buffer, T data);
是主要模板。专业化不是主要模板。编译器在匹配函数时仅查找主模板,然后,如果所选模板函数具有专门化,则会查看这些模板,如果编译器找到专门化,则完全匹配参数 - 使用它,否则使用主模板。
template <> buffer_t &operator<<(buffer_t &buffer, const Glib::ustring &data)
该专业与操作不完全匹配buffer_t << Glib::ustring("s")
,但这完全匹配
template <> buffer_t &operator<<(buffer_t &buffer, Glib::ustring data)
我建议您不要使用函数模板专业化,而使用重载。
template <typename T> buffer_t &operator<<(buffer_t &buffer, T data);
buffer_t &operator<<(buffer_t &buffer, const char *data);
buffer_t &operator<<(buffer_t &buffer, const Glib::ustring &data);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)