невозможно преобразовать параметр из `const char *` в `char *` - PullRequest
2 голосов
/ 17 октября 2011

Учитывая этот код:

void group::build(int size, std::string *ips){
/*Build the LL after receiving the 
member list from bootstrap*/
head = new member("head");
member *temp1,*temp2;

temp1 = new member(ips[0].data());  // error here
    // ....
}

member::member(char *ip){
strcpy_s(this->ip_addr,sizeof(ip),ip);
this->next = NULL;
this->previous = NULL;
}

И указатель на строку, определенную как:

std::string *ips;

Я хочу инициализировать массив, ips со строками, но когда я пытаюсьполучить данные char от любого члена массива. Я получаю сообщение об ошибке:

не может преобразовать параметр из const char * в char *

Почему?

Ответы [ 6 ]

3 голосов
/ 17 октября 2011

Функция, которую вы вызываете, ожидает указатель на модифицируемый буфер, char*.Вы передаете указатель на немодифицируемый буфер, const char*.

Поскольку ваша функция member не изменяет свой ввод, вы должны изменить ее объявление, чтобы получить const char*.

member::member(const char *ip)
1 голос
/ 17 октября 2011

std :: string data имеет эту подпись

const char* data() const;

Вы пытаетесь вызвать член c'tor, с которым ожидает char *, так что вот ваша ошибка.

Измените это:member::member(char *ip)

К этому: member::member(const char *ip)

1 голос
/ 17 октября 2011

Изменить это:

member::member(char *ip)

к этому

member::member(const char *ip)

То есть вы должны изменить тип параметра конструктора.


В качестве альтернативы, которая также является лучшим решением, просто введите параметр const std::string &:

member::member(const std::string &)

Этот подход позволяет использовать лучшие интерфейсы, предоставляемые классом std::string. Эти интерфейсы намного лучше, чем интерфейсы C-string, такие как strcpy, strlen, strcat и т. Д.

1 голос
/ 17 октября 2011

Поскольку member :: member определен так, чтобы принимать char * в качестве параметра, а string.data () дает const char * в качестве значения (так как он возвращает ссылку на свою внутреннюю память). Вы можете использовать const_cast или изменить подпись метода member :: member.

1 голос
/ 17 октября 2011

Ну, data() возвращает const char*, отсюда и ошибка. Вы должны изменить member::member, чтобы получить const char*, так как вы все равно копируете его значение.

Также обратите внимание, что sizeof(ip) равно sizeof(char*), что является размером указателя. Вместо этого вы должны передать размер буфера this->ip_addr.

0 голосов
/ 17 октября 2011

Смена строки

member::member(char *ip)

до

member::member(const char *ip)

и я не уверен, что вы используете strcpy_s

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...