Исключение «множественные вхождения» для бустов - PullRequest
1 голос
/ 25 июля 2010

Я пишу следующий код в boost_options (версия 1.42). Это кажется простым и взятым из учебника. Тем не менее, я получаю сообщение об ошибке «множественные_очеты». Дальнейшее расследование обнаруживает, что это (вероятно) параметр имени файла, который вызывает его.

Параметры, которые я даю:

3 1 test.txt 100

У меня нет никакого понимания этого ... любая помощь будет оценена.

po::options_description common("Common options");

common.add_options()
    ("help", "produce help message")
    ("motif_size", po::value<int>(&motif_size), "Size of motif (subgraph)")
    ("prob", po::value<double>(&prob), "Probably to continue examining an edge")
    ("filename", po::value<string>(&input_filename), "Filename of the input graph")
    ("repeats", po::value<int>(&n_estimates), "Number of estimates")
    ;

po::options_description all;
all.add(common);

po::positional_options_description p;
p.add("motif_size", 0).add("prob", 1).add("filename", 2).add("repeats", 3);

po::variables_map vm;   
po::store(po::command_line_parser(argc, argv).
      options(all).positional(p).run(), vm);
po::notify(vm); 

1 Ответ

6 голосов
/ 25 июля 2010

РЕДАКТИРОВАТЬ :

вторым параметром po::positional_options_description::add является max count , а не позиция.Позиция подразумевается в том порядке, в котором вы указываете позиционные параметры.Так что

p.add("motif_size", 0).add("prob", 1).add("filename", 2).add("repeats", 3);

должно быть

p.add("motif_size", 1).add("prob", 1).add("filename", 1).add("repeats", 1);

Вот скомпилированный фрагмент

include <boost/program_options.hpp>

#include <iostream>
#include <string>

int
main(unsigned argc, char** argv)
{
    namespace po = boost::program_options;
    po::options_description common("Common options");

    common.add_options()
        ("help", "produce help message")
        ("motif_size", po::value<int>(), "Size of motif (subgraph)")
        ("prob", po::value<double>(), "Probably to continue examining an edge")
        ("filename", po::value<std::string>(), "Filename of the input graph")
        ("repeats", po::value<int>(), "Number of estimates")
        ;

    po::options_description all;
    all.add(common);

    po::positional_options_description p;
    p.add("motif_size", 1).add("prob", 1).add("filename", 1).add("repeats", 1);

    po::variables_map vm;
    try {
        po::store(po::command_line_parser(argc, argv).
                options(all).positional(p).run(), vm);
        po::notify(vm); 
    } catch ( const boost::program_options::error& e ) {
        std::cerr << e.what() << std::endl;
    }

    return 0;
}

и пример вызова.

macmini:~ samm$ g++ parse.cc -lboost_program_options
macmini:~ samm$ ./a.out 3 1 test.txt 100
macmini:~ samm$ 

Мой оригинальный ответниже.


Какая версия program_options?У меня была та же проблема с использованием Boost 1.39, чтобы решить ее, я в итоге использовал Boost 1.42.

Вот ссылка на ticket , описывающая проблему, и патч, который нужно применить, если вы неЯ не хочу или не могу обновить вашу копию Boost.Чтобы использовать новую функциональность, сделайте что-то вроде этого

try {
    // argument parsing goes here
} catch ( const boost::program_options::multiple_occurrences& e ) {
    std::cerr << e.what() << " from option: " << e.get_option_name() << std::endl;
}
...