[英]Why does it not work to overload “operator <<” on std::string?
#include <string>
#include <type_traits>
using namespace std;
template
<
typename CharT,
template<typename> class Traits,
template<typename> class Allocator,
typename RightT,
typename StringT = basic_string
<
CharT,
Traits<CharT>,
Allocator<CharT>
>
>
enable_if_t
<
is_constructible<StringT, RightT>::value,
StringT&
>
operator <<(StringT& lhs, const RightT& rhs)
{
return lhs.append(rhs);
}
int main()
{
string s1, s2;
s1 << s2; // compilation error!
return 0;
}
我的编译器是VS 2015 Update3。编译错误消息是:
错误:对二进制表达式(“字符串”(又名“ basic_string,分配器>”)和“字符串”)无效的操作数
为什么它不能按预期工作?
编译器是否提供了比该行更多的信息? 就像是:
26:1: note: template argument deduction/substitution failed:
35:11: note: couldn't deduce template parameter 'CharT'
如果您更换
operator <<(StringT & lhs, const RightT& rhs)
与
operator <<(basic_string<CharT, Traits<CharT>, Allocator<CharT>>& lhs, const RightT& rhs)
它编译。
基本上,您将购物车摆在马匹前面。 如果您已经知道模板args, 则可以使用模板args形成默认模板arg( StringT = ...
)。 您不能使用默认值来确定参数。
如果要同时支持basic_string
和其他/自定义字符串,则可能需要编写两个专业化名称或类似内容。
或者意识到您的模板需求实际上是什么-您不需要可构造的,您需要“可附加的”,因此在SFINAE上,而忽略它是basic_string还是MyCustomString-没关系; 唯一重要的是lhs.append(rhs)
是否有效(而且,嗯,还应该弄清楚它的返回类型...)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.