1

に慣れるために、このクイック関数を作成しましたboost::program_optionspoは名前空間エイリアスであり、次のように定義されている ことに注意してください: 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

関数本体の 2 行目をコメント アウトすると、アプリケーションは正常にコンパイルされ、のアドレスが出力されますvm。ただし、ここに表示されている関数でコンパイルしようとすると、次のようなコンパイラの侮辱が発生します。

invalid types ‘boost::program_options::variables_map*[const char [7]]’ for array subscript

std::cout << vm->count("infile")2 行目をreturn に置き換えることに注意してください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’)

ここで私は何を間違えましたか?

編集:私の質問が反対票を投じられた理由を教えていただければ幸いです。あまりにも基本的ですか?

4

1 に答える 1

6

[]演算子は、単項演算子よりも優先順位が高くなります*。したがって、*vm["infile"]は と同じ*(vm["infile"])ですが、 が必要です(*vm)["infile"]

于 2013-05-18T18:01:25.930 に答える