2016-10-20 8 views
3

std::stringcharから作成する。例えば、グラム++で、C++で単一のcharからstd :: stringを構築できないのはなぜですか?

#include <string> 

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

をコンパイルされません、私はこの多くのエラーを取得

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; 
} 

何かアドバイス、ありがとう。

+4

'std :: string s(1、 'a')'を使うことができます。 – Jarod42

+3

アドバイスが必要ですか、コンストラクタが存在しない理由を知りたいですか? – juanchopanza

+1

@juanchopanza同様に。私は誰かが実際の質問に答えようとしているのかどうかを知りたいのです。「このコンストラクターがないのは正当な理由があるのですか?誰かが標準委員会からの騒ぎの知識を持っていない限り、それは答えることができないかもしれません – WhozCraig

答えて

3

はい、1文字のコンストラクタはありませんが、1文字のoperator+=があります。

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

または単一文字と繰り返し回数受け取るコンストラクタ:Cで、

std::string s(1, c); 

するか、

あなたは文字ポインタとコピー回数を受け取るコンストラクタを使用することができます++ 11以降、aを受け入れるコンストラクタstd::initialization_list

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

の場合' string s = {c};は実際にどうしますか?つまり、これは 'string(1、c)'よりも良い方法でしょうか? –

+0

[List Initialization](http://en.cppreference.com/w/cpp/language/list_initialization)を参照してください。この文脈では '{c}'は* braced-init-list *であり、コンパイラによって[std :: initializer_list '](http://en.cppreference.com/w/cpp/ユーティリティ/ initializer_list)は、単一の文字 'c'を含む固定配列をラップします。 'std :: string'には、' std :: initializer_list 'を入力として受け入れるコンストラクタがあります。 –

5

std :: stringには、単一のコンストラクタがありませんcharです。使用可能なすべてのコンストラクタhereを見ることができます。

operator+=is overloadedシングルcharです。単一文字、などからstd::stringを作成するために

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

:それはすでに述べたように

、あなたは、コンストラクタを使用することができます

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

これは最善の方法だと思います。単純な 'string(c)'のケースはうまくいきません。 –

5

stringcharではありません、だから私はなぜ、あなたが誰かがもう片方に変わることを期待するのか分からない。前者は後者のコレクションです。確かに、正当化は逆の方向にあります。あなたはそのようなコンストラクタが存在することを正当化する必要があり、実際には存在しません。 charからstringへの暗黙の変換を行うことは非常に奇妙である。

あなたは、単一の要素のコレクションをしたい場合は、そのためのconstructorsがあります

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 
+5

1つの文字から1文字の文字列を作成できると期待するのは無理はありません。それは単に存在することはありません。 – Barmar

+1

'std :: string s2 {c};'は 'std :: string s2 {{c}};'にする必要がありますか、または中括弧はここで崩壊しますか? – NathanOliver

+1

@NathanOliverいいえ、私たちは 'initializer_list 'コンストラクタを呼び出しています。 – Barry

5

ここに行く:

string const s{ 'A' }; 

これがサポートされていないという噂、誇張されています。

これは技術的にはinitializer_listコンストラクタを使用します。

+0

「A」ではなく「char c」があればどうしますか? –

+0

同じタイプです。また、必要に応じて実行時にイニシャライザが評価されます。 –

関連する問題