c++ - boost 程序选项 : argument being detected more than once

标签 c++ c++11 boost command-line-interface

以下代码检测多次指定的参数。

命令行参数解析器的实现是为了确保用户提供一个string (mps-file), integer (n) 和一个整数序列(0, n-1) 允许其他可选。

但是,当使用以下标志编译代码时:
g++ -std=c++11 test.cpp/home/not_me/my_lib/boost_1_64_0/stage/lib/libboost_program_options.so

完美编译。但是当以下面的方式执行时,它会抛出下面的异常。

/src/a.out --mps-file earth.mps --n 5 --size 10 --seed 10 --order 0 1 2 3 4
error: option '--mps-file' cannot be specified more than once

但如果使用以下命令执行,它运行良好:
./src/a.out earth.mps 5 10 10 --order 0 1 2 3 4

完整代码:

#include <iostream>
#include <numeric>

#include <boost/program_options.hpp>

int main (int argc, char* argv[]) {

    int n;
    int sample_size = 10;
    std::random_device rd;
    int seed = rd();
    std::string mps_name;
    std::vector<int> order;

    boost::program_options::options_description desc("options");
    desc.add_options()
        ("mps-file", boost::program_options::value<std::string>(&mps_name)->required(), "input mps file")
        ("n", boost::program_options::value<int>(&n)->required(), "number of variables")
        ("size", boost::program_options::value<int>(&sample_size)->default_value(sample_size), "size of sample")
        ("seed", boost::program_options::value<int>(&seed)->default_value(seed), "seed value")
        ("order", boost::program_options::value<std::vector<int>>(&order)->required(), "ordering")
        ("help", "this help message")
        ;

    boost::program_options::positional_options_description p;
    p.add("mps-file", 1);
    p.add("n", 1);
    p.add("order", -1);

    boost::program_options::variables_map vm;

    try {
        boost::program_options::store(boost::program_options::command_line_parser(argc, argv).
                                      options(desc).positional(p).run(), vm);

        if (vm.count("help") || argc == 1) {
            std::cout << "usage: " << argv[0] << " [options]" << std::endl;
            std::cout << desc;
            return -1;
        }

        boost::program_options::notify(vm);
    }
    catch (std::exception& e) {
        std::cout << "error: " << e.what() << std::endl;
        return -1;
    }

    std::vector<int> temp = order;
    std::sort(temp.begin(), temp.end());
    for (int i = 0; i < n; ++i) {
        if (temp[i] == i) { continue; }
        std::cout << "incorrect ordering given" << std::endl;
        return -1;
    }

    if (n != order.size()) {
        std::cout << "mismatch between the 'n' and given ordering" << std::endl;
        return -1;
    }

    return 0;
} // main

最佳答案

问题出在位置选项上。当您删除它们并从 boost::program_options::command_line_parser(argc, argv) 调用 positional(p) 时。 选项(desc).positional(p).run() 你的问题就会消失。因为您只删除了 add() 行并留下了 positional(p),所以您遇到了一个不同的问题:“在命令行上指定了太多的位置选项”。

我想你的电话有问题:

/src/a.out --mps-file earth.mps --n 5 --size 10 --seed 10 --order 0 1 2 3 4

是当位置1上定义了位置选项时,那么字符串---mps-file就可以认为是这个选项本身的值。因此,如果选项被定义为位置,您可能应该避免传递带有名称的选项。

关于c++ - boost 程序选项 : argument being detected more than once,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46078852/

相关文章:

c++ - 将可变参数模板内容转储到二维数组

c++ - Boost智能指针设计问题

c++ - 使用 Boost.GIL 将图像转换为 "raw"字节

c++ - void() 问题 - 它不打印结果

c++ - Q : How bitset are inside?

c++ - 尝试初始化 __m128 类成员变量时出现 EXC_BAD_ACCESS 信号

c++ - 为什么这个用户定义的转换没有完成?

C++ - 如何解决函数重载歧义

c++ - 如何配置 Clion 以使用 SDL2?

通过 Netbeans 远程开发在 Linux 上的 C++ Boost:对 boost::filesystem::path::codecvt() 的 undefined reference