【发布时间】:2013-05-18 17:52:08
【问题描述】:
我编写这个快速函数是为了熟悉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。
我做错了什么?我是在滥用 boost 构造,还是在(取消)引用 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"]。 -
值得记住的一点:
[]的优先级高于*,而p->x是(*p).x的糖(或多或少) -
虽然
(*vm).["infile"]可能会起作用,但最好还是解决这个问题——通过引用而不是通过指针传递vm。 -
@RayToal,啊,哎呀!这确实很好知道!现在一切都说得通了……我的编译器正试图取消引用指针上
[]的结果,对吗?
标签: c++ boost boost-program-options