簡體   English   中英

為什么我不能用C ++中的單個char構造一個std :: string?

[英]Why can't i construct a std::string from a single char in C++?

char創建一個std::string 例如,不會編譯,

#include <string>

int main()
{
    char c = 'a';
    std::string s(c);
    return 0;
}

在g ++中,我得到了這么多錯誤,

foo.cpp: In function 'int main()':
foo.cpp:6:20: error: no matching function for call to 'std::__cxx11::basic_strin
g<char>::basic_string(char&)'
     std::string s(c);
                    ^
In file included from i:/Qtandroid/Qt5.7.0/Tools/mingw530_32/i686-w64-mingw32/in
clude/c++/string:52:0,
                 from foo.cpp:1:
i:/Qtandroid/Qt5.7.0/Tools/mingw530_32/i686-w64-mingw32/include/c++/bits/basic_s
tring.h:535:9: note: candidate: template<class _InputIterator> std::__cxx11::bas
ic_string<_CharT, _Traits, _Alloc>::basic_string(_InputIterator, _InputIterator,
 const _Alloc&)
         basic_string(_InputIterator __beg, _InputIterator __end,
         ^
i:/Qtandroid/Qt5.7.0/Tools/mingw530_32/i686-w64-mingw32/include/c++/bits/basic_s
tring.h:535:9: note:   template argument deduction/substitution failed:
foo.cpp:6:20: note:   candidate expects 3 arguments, 1 provided
     std::string s(c);
                    ^
In file included from i:/Qtandroid/Qt5.7.0/Tools/mingw530_32/i686-w64-mingw32/in
clude/c++/string:52:0,
                 from foo.cpp:1:
i:/Qtandroid/Qt5.7.0/Tools/mingw530_32/i686-w64-mingw32/include/c++/bits/basic_s
tring.h:465:7: note: candidate: std::__cxx11::basic_string<_CharT, _Traits, _All
oc>::basic_string(std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type
, _CharT, const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>;
_Alloc = std::allocator<char>; std::__cxx11::basic_string<_CharT, _Traits, _Allo
c>::size_type = unsigned int]
       basic_string(size_type __n, _CharT __c, const _Alloc& __a = _Alloc())
       ^
i:/Qtandroid/Qt5.7.0/Tools/mingw530_32/i686-w64-mingw32/include/c++/bits/basic_s
tring.h:465:7: note:   candidate expects 3 arguments, 1 provided
i:/Qtandroid/Qt5.7.0/Tools/mingw530_32/i686-w64-mingw32/include/c++/bits/basic_s
tring.h:455:7: note: candidate: std::__cxx11::basic_string<_CharT, _Traits, _All
oc>::basic_string(const _CharT*, const _Alloc&) [with _CharT = char; _Traits = s
td::char_traits<char>; _Alloc = std::allocator<char>] <near match>
       basic_string(const _CharT* __s, const _Alloc& __a = _Alloc())
       ^
i:/Qtandroid/Qt5.7.0/Tools/mingw530_32/i686-w64-mingw32/include/c++/bits/basic_s
tring.h:455:7: note:   conversion of argument 1 would be ill-formed:
foo.cpp:6:20: error: invalid conversion from 'char' to 'const char*' [-fpermissi
ve]
     std::string s(c);
                    ^
In file included from i:/Qtandroid/Qt5.7.0/Tools/mingw530_32/i686-w64-mingw32/in
clude/c++/string:52:0,
                 from foo.cpp:1:
i:/Qtandroid/Qt5.7.0/Tools/mingw530_32/i686-w64-mingw32/include/c++/bits/basic_s
tring.h:445:7: note: candidate: std::__cxx11::basic_string<_CharT, _Traits, _All
oc>::basic_string(const _CharT*, std::__cxx11::basic_string<_CharT, _Traits, _Al
loc>::size_type, const _Alloc&) [with _CharT = char; _Traits = std::char_traits<
char>; _Alloc = std::allocator<char>; std::__cxx11::basic_string<_CharT, _Traits
, _Alloc>::size_type = unsigned int]
       basic_string(const _CharT* __s, size_type __n,
       ^
i:/Qtandroid/Qt5.7.0/Tools/mingw530_32/i686-w64-mingw32/include/c++/bits/basic_s
tring.h:445:7: note:   candidate expects 3 arguments, 1 provided
i:/Qtandroid/Qt5.7.0/Tools/mingw530_32/i686-w64-mingw32/include/c++/bits/basic_s
tring.h:427:7: note: candidate: std::__cxx11::basic_string<_CharT, _Traits, _All
oc>::basic_string(const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&, st
d::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type, std::__cxx11::basi
c_string<_CharT, _Traits, _Alloc>::size_type, const _Alloc&) [with _CharT = char
; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; std::__cxx11:
:basic_string<_CharT, _Traits, _Alloc>::size_type = unsigned int]
       basic_string(const basic_string& __str, size_type __pos,
       ^
i:/Qtandroid/Qt5.7.0/Tools/mingw530_32/i686-w64-mingw32/include/c++/bits/basic_s
tring.h:427:7: note:   candidate expects 4 arguments, 1 provided
i:/Qtandroid/Qt5.7.0/Tools/mingw530_32/i686-w64-mingw32/include/c++/bits/basic_s
tring.h:411:7: note: candidate: std::__cxx11::basic_string<_CharT, _Traits, _All
oc>::basic_string(const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&, st
d::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type, std::__cxx11::basi
c_string<_CharT, _Traits, _Alloc>::size_type) [with _CharT = char; _Traits = std
::char_traits<char>; _Alloc = std::allocator<char>; std::__cxx11::basic_string<_
CharT, _Traits, _Alloc>::size_type = unsigned int]
       basic_string(const basic_string& __str, size_type __pos,
       ^
i:/Qtandroid/Qt5.7.0/Tools/mingw530_32/i686-w64-mingw32/include/c++/bits/basic_s
tring.h:411:7: note:   candidate expects 3 arguments, 1 provided
i:/Qtandroid/Qt5.7.0/Tools/mingw530_32/i686-w64-mingw32/include/c++/bits/basic_s
tring.h:399:7: note: candidate: std::__cxx11::basic_string<_CharT, _Traits, _All
oc>::basic_string(const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&) [w
ith _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<cha
r>]
       basic_string(const basic_string& __str)
       ^
i:/Qtandroid/Qt5.7.0/Tools/mingw530_32/i686-w64-mingw32/include/c++/bits/basic_s
tring.h:399:7: note:   no known conversion for argument 1 from 'char' to 'const
std::__cxx11::basic_string<char>&'
i:/Qtandroid/Qt5.7.0/Tools/mingw530_32/i686-w64-mingw32/include/c++/bits/basic_s
tring.h:391:7: note: candidate: std::__cxx11::basic_string<_CharT, _Traits, _All
oc>::basic_string(const _Alloc&) [with _CharT = char; _Traits = std::char_traits
<char>; _Alloc = std::allocator<char>]
       basic_string(const _Alloc& __a)
       ^
i:/Qtandroid/Qt5.7.0/Tools/mingw530_32/i686-w64-mingw32/include/c++/bits/basic_s
tring.h:391:7: note:   no known conversion for argument 1 from 'char' to 'const
std::allocator<char>&'
i:/Qtandroid/Qt5.7.0/Tools/mingw530_32/i686-w64-mingw32/include/c++/bits/basic_s
tring.h:380:7: note: candidate: std::__cxx11::basic_string<_CharT, _Traits, _All
oc>::basic_string() [with _CharT = char; _Traits = std::char_traits<char>; _Allo
c = std::allocator<char>]
       basic_string()
       ^
i:/Qtandroid/Qt5.7.0/Tools/mingw530_32/i686-w64-mingw32/include/c++/bits/basic_s
tring.h:380:7: note:   candidate expects 0 arguments, 1 provided

有沒有理由讓這個構造函數丟失。

這有效,但感覺不對,

#include <string>

int main()
{
    char c = 'a';
    std::string s;
    s += c;
    return 0;
}

任何建議,謝謝。

std :: string沒有來自單個char的構造函數。 您可以在此處查看所有可用的構造函數。

從另一方面, operator+= 被重載為單個字符

正如已經提到的,您可以使用構造函數:

basic_string( size_type count, 
              CharT ch, 
              const Allocator& alloc = Allocator() );

從單個char創建一個std::string ,如:

std::string s(1, 'a');

string不是char ,所以我不知道為什么你會期望一個string可以轉換為另一個string 前者是后者的集合。 實際上,理由是相反的方向 - 你需要為這樣一個構造函數存在的理由而且確實沒有理由存在。 charstring的隱式轉換將非常非常奇怪。

如果你想要一個單一元素的集合,那么有一些構造函數

std::string s1(1, c); // (2) create a string composed of 1 repeated character c
std::string s2{c};    // (9) create a string based on this sequence of chars

干得好:

string const s{ 'A' };

關於這不受支持的謠言是誇大其詞。

從技術上講,這使用了initializer_list構造函數。

是的,沒有單字符構造函數,但有一個單字符operator+=有點奇怪。

您可以使用接受字符指針和副本計數的構造函數:

std::string s(&c, 1);

或者接受單個字符和重復計數的構造函數:

std::string s(1, c);

或者,在C ++ 11及更高版本中,接受std::initialization_list的構造std::initialization_list

std::string s{c};
or
std::string s = {c};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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