Почему он пытается отправить массив символов вместо строки? - PullRequest
2 голосов
/ 19 января 2011

Объявление моей функции
siteObject(std::string& url, std::string& get, std::string& post);

Так почему же это site("String 1", "String 2", "String 3"); создание ошибки несоответствия типов. Он говорит, что хочет ссылку на строку и получает массив символов. Если вам нужно больше деталей, просто спросите в комментариях.

Ответы [ 5 ]

6 голосов
/ 19 января 2011

Поскольку существует неявный вызов конструктора std::string, который создает временный объект. Вы не можете использовать неконстантную ссылку на временное (потому что бессмысленно изменять временное).

Таким образом, либо измените вашу функцию так, чтобы она принимала const ссылки, либо по значению, либо передавайте ей временные объекты.

3 голосов
/ 19 января 2011

Ваша siteObject функция:

siteObject(std::string& url, std::string& get, std::string& post);

принимает неконстантные ссылки на строковые объекты, которые нельзя привязать к значениям (или временным значениям).

Когда вы пытаетесь вызватьФункция со строковыми литералами, компилятор должен преобразовать эти аргументы (которые char*) во что-то, что соответствует типам параметров - это преобразование приводит к временному std::string объекту.

Вам нужно будет изменитьВаша функция принимает константные ссылки, если вы хотите иметь возможность привязать их к временным файлам:

siteObject(std::string const& url, std::string const& get, std::string const& post);

Или вы можете передавать значения вместо ссылок:

siteObject(std::string url, std::string get, std::string post);
1 голос
/ 19 января 2011

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

1 голос
/ 19 января 2011

Правильный вызов:

std::string url("...");
std::string get("...");
std::string post("...");

siteObject(url, get, post);

Это имеет смысл, поскольку сигнатура метода подразумевает, что вы возвращаете что-то в три строки (неконстантные ссылки) и можете использовать эти возвращаемые значения.

Если это не является намерением, и у вас есть возможность изменить метод siteObject (), тогда вы должны сделать:

siteObject(std::string const & url, std::string const & get, std::string const & post);

и используйте свой исходный вызов.

0 голосов
/ 19 января 2011

Строки, введенные в двойных кавычках, происходят из C-наследия C ++ (они называются C-строкой или NUL-концевой строкой). Они реализуются компилятором как массив char. Напротив, std::string - это класс C ++, целью которого является упрощение манипулирования строками. Он владеет строкой C (и может быть создан из нее, поскольку имеет конструктор, принимающий const char*) и управляет своей памятью.

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

Вы можете создать std::string и передать их функции:

std::string s1("String 1");
std::string s2("String 2");
std::string s3("String 3");
site(s1, s2, s3);

Или вы можете изменить прототип функции site, чтобы принимать константную ссылку. Это возможно только в том случае, если функция не изменяет объекты и у вас есть доступ к коду:

// Declaration
void site(const std::string& s1, const std::string& s2, const std::string s3);

// Usage
site("String 1", "String 2", "String 3");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...