2014-11-13 4 views
3

Почему в следующем коде есть ошибка компиляции?Строка C++ манипуляции

#include<iostream> 
#include<string> 
using namespace std; 

int main() 
{ 
    string str="abc"; 

    string result=str[0]; 
    cout<<result<<endl; 
    return 0; 
} 

Однако, следующий код работает отлично:

#include<iostream> 
#include<string> 
using namespace std; 

int main() 
{ 
    string str="abc"; 

    str=str[0]; 
    cout<<str<<endl; 
    return 0; 
} 

Я работает в UNIX и команда компиляции: "г ++ -g test.cpp -std = C++ 11 -oa", тогда М ./a

ошибка в первый test.cpp после компиляции является:

test.cpp:9:21: error: invalid conversion from 'char' to 'const char*' [-fpermissive] 
    string result=str[0]; 
        ^
In file included from /usr/um/gcc-4.8.2/include/c++/4.8.2/string:52:0, 
       from /usr/um/gcc-4.8.2/include/c++/4.8.2/bits/locale_classes.h:40, 
       from /usr/um/gcc-4.8.2/include/c++/4.8.2/bits/ios_base.h:41, 
       from /usr/um/gcc-4.8.2/include/c++/4.8.2/ios:42, 
       from /usr/um/gcc-4.8.2/include/c++/4.8.2/ostream:38, 
       from /usr/um/gcc-4.8.2/include/c++/4.8.2/iostream:39, 
       from test.cpp:1: 
/usr/um/gcc-4.8.2/include/c++/4.8.2/bits/basic_string.h:490:7: error: initializing argument 1 of 'std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT*, const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]' [-fpermissive] 
     basic_string(const _CharT* __s, const _Alloc& __a = _Alloc()); 
    ^
+0

и компиляция ошибка ...? – clcto

+0

http://programmers.stackexchange.com/questions/75039/why-declare-a-variable-in-one-line-and-assign-to-it-in-the-next может дать вам некоторое просвещение –

ответ

1

следующий код работает отлично, а также:

string result; 
result=str[0]; 

Это означает, что разница между инициализации и простого присваивания, и если вы исследуете ошибку:

error: invalid conversion from ‘char’ to ‘const char*’ 

должно быть ясно, что инициализация не как «полнофункциональный» в качестве уступки - конструктор no string, который принимает аргумент char (там - присвоение, которое принимает char, поэтому ваш второй пример работает).

Вы можете это исправить (в одну сторону, нет никаких сомнений в других, а) путем обеспечения инициализации со строкой, а не характер:

string result = str.substr(0,1); 
0

ул [0] возвращает символ &, но не без преобразования из полукокса & в StD :: строка

попытка разжижает вместо

string result = string(1, str[0]); 
3

std::basic_string не имеет any constructor, который принимает один аргумент CharT. Это означает, что std::string (т. Е. std::basic_string<char>) не может быть построен из одного char.

Класс имеет, однако, assignment operator overload, который принимает один аргумент CharT, поэтому ваш второй пример компилируется.

Разница между этими двумя случаями, потому что в первом вы выполняете инициализации копии, что означает, технически вы первые попытки построить временный std::string экземпляр из char аргумента, а затем скопировать его на result , Во втором вы выполняете назначение , что означает назначение нового значения для существующего экземпляра std::string.


basic_string имеет конструктор, который принимает отсчет следует символ:

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

поэтому ваш оригинальный пример компилируется, если вы изменили обижая строку

string result = {1, str[0]}; 
+0

Однако, следуйте вашей логике, я попробовал перегрузку задания: #include #include using namespace std; int main() {\t \t string result = 'a'; \t cout << результат << endl; \t возвращение 0; } Еще ошибка сборки !!! – user3259711

+1

@ user3259711 В этом коде не происходит никаких заданий. 'string result = 'a';' - инициализация копии; это то же самое, что и ваш пример, который не выполняется, за исключением того, что вы используете литерал. – Praetorian

Смежные вопросы