Я написал эту быструю функцию, чтобы познакомиться с boost::program_options
, Обратите внимание, что po
псевдоним пространства имен, определенный следующим образом: namespace po = boost::program_options
,
int application(po::variables_map* vm)
{
std::cout << vm << std::endl;
std::cout << *vm["infile"].value();
// also tried: std::cout << *vm["infile"]
return SUCCESS;
} //application
Когда я закомментирую вторую строку в теле функции, приложение успешно компилирует и печатает адрес vm
, Тем не менее, когда я пытаюсь скомпилировать с функцией, отображаемой здесь, я получаю следующее оскорбление компилятора:
invalid types ‘boost::program_options::variables_map*[const char [7]]’ for array subscript
Должен отметить, что замена второй строки на std::cout << vm->count("infile")
возвращается 1
,
Что я сделал не так? Злоупотребляю ли я бустовой конструкцией или я замешан в (де) ссылках vm
?
Обновить
Следуя предложению перейти по ссылке, чтобы избежать проблемы приоритета оператора, я переписал свою функцию следующим образом:
int application(po::variables_map& vm)
{
std::cout << &vm << std::endl;
std::cout << vm["infile"].value();
return SUCCESS;
} //application
Теперь я получаю другую ошибку:
no match for ‘operator<<’ (operand types are ‘std::ostream {aka std::basic_ostream<char>}’ and ‘const boost::program_options::variable_value’)
Что я здесь не так сделал?
Редактировать: Я был бы признателен, если бы мне сказали, почему мой вопрос опровергают. Это слишком просто?
[]
оператор имеет более высокий приоритет, чем унарный *
оператор. Таким образом, *vm["infile"]
такой же как *(vm["infile"])
, но ты хочешь (*vm)["infile"]
,
Других решений пока нет …