簡體   English   中英

為什么在std :: string上重載“ operator <<”不起作用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM