2010-04-16 3 views
0
#include <iostream> 
#include <string> 
using namespace std; 
int main(void) 
{ 
    string a; 
    cin>>a; 
    a.erase(a.end()-1); 
    a.erase(a.begin()+1); 
    string ge = "oae"; 
    a.insert(a.begin()+1, ge); 
    cout<<a<<endl; 
    return 0; 
} 

Он не компилируется, и я не знаю почему. Не могли бы вы рассказать мне, что не такЧто случилось со следующим кодом?

+5

Что такое компилятор ошибки givin'you? –

+0

Кроме того, какой компилятор? Возможно, вы используете нестандартный компилятор или с параметрами, которые заставляют его вести себя нестандартным способом. –

ответ

3

http://www.cplusplus.com/reference/string/string/insert/

string& insert (size_t pos1, const string& str); 
string& insert (size_t pos1, const string& str, size_t pos2, size_t n); 
string& insert (size_t pos1, const char* s, size_t n); 
string& insert (size_t pos1, const char* s); 
string& insert (size_t pos1, size_t n, char c); 
iterator insert (iterator p, char c); 
    void insert (iterator p, size_t n, char c); 
template<class InputIterator> 
    void insert (iterator p, InputIterator first, InputIterator last); 

Ваш призыв к std::basic_string<t>::insert не соответствует ни одному из перечисленных выше перегрузок.

a.insert(a.begin()+1, ge); 

должен быть

a.insert(a.begin()+1, ge.begin(), ge.end()); 

или

a.insert(1, ge); 

В противном случае этот код не действителен.

1

a.insert(a.begin()+1, ge); есть проблема.

Функция string::insert принимает int как первый параметр, и вы передаете итератор. Что ты пытаешься сделать?

+1

Перегрузка std :: basic_string :: insert принимает параметр int. Некоторые перегрузки принимают параметры 'size_t', но не один принимает int. –

+0

@Billy: интересно, мой компилятор выплюнул: ошибка C2664: 'std :: basic_string <_Elem, _Traits, _Ax> & std :: basic_string <_Elem, _Traits, _Ax> :: insert (unsigned int, const std :: basic_string <_Elem, _Traits, _Ax> &) ': не может преобразовать параметр 1 из' std :: _ String_iterator <_Elem, _Traits, _Alloc> 'в' unsigned int ' Я полагаю, что должен был сказать «unsigned int». – David

+0

Size_t - это typedef для unsigned int в вашем компиляторе. Однако стандарт не определяет его таким образом. Это может быть unsigned long, или unsigned long long, или unsigned short, или любой другой подобный тип и соответствовать стандарту. –

1

Рабочая версия:

#include <iostream> 
#include <string> 
using namespace std; 
int main(void) 
{ 
    string a; 
    cin>>a; 
    a.erase(a.end()-1); 
    a.erase(a.begin()+1); 
    string ge = "oae"; 
    a.insert(1, ge);   // here 
    cout<<a<<endl; 
    return 0; 
} 
+0

+1, потому что это правильно, и вы новичок, но в будущем вы вряд ли получите поддержку только для публикации исправленного кода. Вам нужно объяснить, почему код был неправильным для начала. –

1

Там нет std::string::insert() перегрузки, которая принимает итератор и string набор параметров. Вы можете выбрать вместо этого использовать:

a.insert(1, ge); // use an index and a string 

или:

a.insert(a.begin()+1, ge.begin(), ge.end()); // use an destination iterator, and 
               // a set of iterators indicating a range 

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

  • если a - пустая строка, то a.end()-1 не определено
  • если a - пустая строка, то a.begin()+1 также не определено
Смежные вопросы