2015-01-13 5 views
2

Будучи новым для C++, я попытался создать простую функцию void в одной из моих программ, чтобы отобразить массив. Однако в заголовке есть ошибка. Я считаю, что это проблема в том, что я пытаюсь вызвать его с помощью массива в другой форме, чем параметры функций. Я не уверен, как это изменить.error: невозможно преобразовать std :: vector <std :: basic_string <char>> to std :: string *

#include <iostream> 
#include <vector> 

using namespace std; 

void display_array(string arr[]){ 
    int i; 
    for (i = 0; i < sizeof(arr); i++); 
     cout<<arr[i]; 
} 

int main() 
{ 
    string current; 
    std::vector<string> paths; 

    cout<<"Input paths in the form 'AB'(0 to exit)"; 
    cin>>current; 
    while (current != "0"){ 
     paths.push_back(current); 
     cin>>current; 
    } 
    display_array(paths); 
} 

Любая помощь приветствуется.

+1

Если 'display_array' должен напечатать' зЬй :: вектор ', сделать аргумент' константный зЬй :: Vect или > & '. –

+1

Обратите внимание, что ваш цикл 'for' имеет точку с запятой на конце, что означает, что цикл ничего не сделает, кроме приращения' i', и следующая строка будет выполнена один раз. – sjdowling

ответ

0

Обозначение функции display_array существовало в C до того, как C++ был вокруг, и из-за того, что C++ был сделан обратно совместимым с C, он также компилируется на C++.

К сожалению, это довольно опасно, потому что интуитивно это приводит к тому, что начинающие совершают ошибки, подобные вашим.

В действительности вы можете заменить [] fpr указателем на функцию так, чтобы она приняла строку *. Размер также равен размеру указателя, а не количеству элементов в массиве, которые не передаются.

Ваши варианты должны передавать указатель и размер или два указателя в диапазоне, где последний один - «один за концом последовательности».

Если вы используете C++ 03, вы должны использовать &arr[0], чтобы перейти к первому элементу. В C++ 11 у вас есть arr.data() как метод, который также безопасно вызывать, когда вектор пуст. (Технически &arr[0] - это неопределенное поведение, если вектор пуст, даже если вы никогда не пытаетесь разыменовать этот указатель).

Таким образом, коррекция, которая позволила бы ваш код работать в C++ 03:

void display_array(const string *arr, size_t size) 
{ 
    int i; 
    for (i = 0; i < size; i++) // no semicolon here.. 
     cout<<arr[i]; 
} 

и называют его:

if(!paths.empty()) 
     display_array(&paths[0], paths.size()); 
-2

Вы должны изменить функцию подписи:

void display_array(vector<string> &arr) 

И:

for (i = 0; i < arr.size(); i++) 
+1

... и потерять ';' в конце строки 'for'. – Angew

+2

Это должно быть ссылка 'const'. – juanchopanza

+0

@Angew К сожалению. Опечатка. – dmg

4

Вопрос заключается в том, что функция display_array принимает string[] в качестве аргумента, но вы передаете в std::vector<std::string>. Вы можете это исправить, изменив функцию display_array принять константную-ссылку на вектор строк вместо массива:

void display_array(const std::vector<string>& arr) { 
    for (auto it = arr.begin(); it != arr.end(); it++) 
     cout<<*it; 
} 

Причины мы переходим в константной-ссылке на вектор вместо прохождения по значению является то, что мы не собираемся изменять вектор, и мы не хотим его копировать. Рекомендуется использовать const всякий раз, когда можете, и подумать о стоимости копирования ваших аргументов.

0

display_array функция принимает массив, следует принять зЬй :: вектор

void display_array(std::vector<string> arr) { 
    for (auto s : arr) 
     std::cout << s; 
} 
Смежные вопросы