【问题标题】:Why is this use of the [] operator causing a compiler error? [closed]为什么使用 [] 运算符会导致编译器错误? [关闭]
【发布时间】: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 &lt;&lt; vm-&gt;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-&gt;x(*p).x 的糖(或多或少)
  • 虽然(*vm).["infile"] 可能会起作用,但最好还是解决这个问题——通过引用而不是通过指针传递vm
  • @RayToal,啊,哎呀!这确实很好知道!现在一切都说得通了……我的编译器正试图取消引用指针上[] 的结果,对吗?

标签: c++ boost boost-program-options


【解决方案1】:

[] 运算符的优先级高于一元 * 运算符。因此,*vm["infile"]*(vm["infile"]) 相同,但您需要 (*vm)["infile"]

【讨论】:

  • 感谢您的回答!我尝试将其重写为传递引用(如 JerryCoffin 建议的那样)。我现在遇到了一个完全不同的错误。你有什么建议吗?
猜你喜欢
  • 2014-02-08
  • 1970-01-01
  • 1970-01-01
  • 2017-04-08
  • 1970-01-01
  • 2017-04-30
  • 2019-04-06
  • 2017-01-19
相关资源
最近更新 更多