2016-01-07 4 views
1

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

Проблема, с которой я сталкиваюсь, на самом деле создает char**. Это моя текущая реализация, закомментированы в источнике, так как он не работает:

IceTea* IceTea::setupCli(vector<string> strings) { 
    int argc=strings.size(), i=0; 
    char* argv[argc]; 
    vector<string>::iterator it; 
    for(it=strings.begin(); it != strings.end(); ++it) { 
     argv[i++] = (char*)it->c_str(); 
    } 

    // Pass the char** to the original method. 
    return this->setupCli(argc, argv); 
} 

Я получаю ошибку:

src/IceTea.cpp:132:18: error: no matching member function for call to 'setupCli' 
    return this->setupCli(argc, argv); 
      ~~~~~~^~~~~~~~ 
src/IceTea.h:44:13: note: candidate function not viable: no known conversion from 'char *[argc]' to 'const char **' for 2nd argument 
    IceTea* setupCli(int, const char**); 
      ^
src/IceTea.cpp:124:17: note: candidate function not viable: requires single argument 'strings', but 2 arguments were provided 
IceTea* IceTea::setupCli(vector<string> strings) { 
+7

_'char * argv [argc]; '_ VLA не являются стандартными C++ –

+0

Как вы объявили вторую функцию' setupCli() '? –

+0

Можете ли вы показать подпись функции с двумя аргументами? – marom

ответ

2

Я боюсь, что вы не можете преобразовать vector<string> в char** в постоянная время , A vector<string> можно легко преобразовать в string*, и string может быть преобразован в char* довольно легко, но вектор не может быть преобразован в char**. На самом деле, это проблема, очень похожая на то, почему int[10][20] не может быть тривиально преобразован в int**.

Теперь, если вы абсолютно необходимо это сделать, то

vector<char*> pointerVec(strings.size()); 
for(unsigned i = 0; i < strings.size(); ++i) 
{ 
    pointerVec[i] = strings[i].data(); 
} //you can use transform instead of this loop 
char** result = pointerVec.data(); 

Основная проблема с вашим кодом является то, что вы используете c_str, которая возвращает const char *. Обратите внимание, что вместо этого я использую функцию-член data(), которая возвращает указатель не const. Еще одно отличие вашей попытки от моего предложения состоит в том, что вы используете массив длины, который не является постоянным выражением. Это незаконно в стандартном C++. Вместо этого я использовал вектор, а затем преобразовал его в указатель с той же функцией data().