2015-06-12 2 views
3

Я пытаюсь нажать строку в вектор строк, как показано нижеSTL push_back строка в векторе

void Node::set_val(string &val) 
{ 
    this->val.push_back(val); 
} 

Но когда я пытаюсь вызвать его, как показано ниже

Obj.set_val("10h;"); 

Я получаю ошибку ниже ,

error: no matching function for call to 'Node::set_val(const char [5])' 

Я предположил, что строка в «» такой же, как string в C++, Почему я получаю такую ​​ошибку? Что нужно изменить ниже?

+0

Ваш 'set_val' ожидает ссылки на параметр' std :: string' в качестве параметра. Но вы передаете только массив const из 5 символов. –

+0

@MertMertce, который был просто для объяснения, я вызываю его через объект – Bharadwaj

ответ

8

Вы принимаете std::string по неконсолидированной ссылке. Неконстантные ссылки не могут связываться с rvalues, такими как "10h;", поэтому вы не можете передавать литералы в эту функцию.

Если вы не собираетесь изменить аргумент, вы должны принять ваши аргументы по ссылке к ПОСТОЯННОМУ:

void Node::set_val(const string &val) 
//     ^^^^^ 

Таким образом, временная std::string будет построена из вашего const char[5] и передаваемая в set_val.

Вы могли бы улучшить это, беря в string по значению и move ИНГ его в vector:

void Node::set_val(string val) 
{ 
    this->val.push_back(std::move(val)); 
} 

Это мешает вам делать некоторые ненужные копии.

0

Вы передаете "10h;", который является массивом const char.

Фикс его, передавая строку: Obj.set_val(string("10h")); и функции редактирования взять строку по значению:

void Node::set_val(string val) { /* */ } 

Или, может быть, лучше, изменить функцию взять const string&:

void Node::set_val(const string &val) { /* */ } 
2

Таким образом, в C++, const char * неявно конвертируется в std :: string, потому что std :: string имеет (неявный) конструктор, который принимает const char *. Так что компилятор пытается здесь создать временный объект станд :: строка для вызова функции, например, так:

Node.set_val(std::string("10h;")); 

Однако, так как вы объявили параметр set_val быть неконстантная ссылка на станд :: string, компилятор не может выполнить эту операцию преобразования из-за того, что временные объекты не могут быть привязаны к неконстантным ссылкам.

Есть три способа сделать эту работу, в зависимости от того, что вы хотите достичь:

void Node::set_val(const std::string& val) {} 
void Node::set_val(std::string val) {} 
void Node::set_val(std::string&& val) {} 

Все будет компилировать (последняя требует C++ 11 или выше), но, видя ваш случай использования, Я бы рекомендовал использовать второй или третий. Для объяснения, почему, попробуйте немного прочитать о семантике перемещения в C++ 11.

Важно, что const char * неявно преобразуется в std :: string, создавая временный объект, а временные объекты не могут передаваться в функции, принимающие неконстантные ссылки.

+0

Я бы не рекомендовал использовать третий вариант, так как вы не можете передать lvalues ​​в него. – TartanLlama

+0

Конечно, вы правы. Я просто обнаружил, что третий вариант дает понять, что это функция приемника. Конечно, это было только мое предположение, что это была функция стока, поэтому второй случай на самом деле более гибкий. Но спасибо, что указали на это :) – Mortano

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