boost::program_选项重载验证不明确

boost::program_选项重载验证不明确,boost,ambiguous,boost-program-options,Boost,Ambiguous,Boost Program Options,我正在尝试解析来自命令行的列表输入 我的课是从向量中派生出来的 编译器抱怨重载验证不明确。 我知道为什么,但不知道如何解决这个问题 请帮忙 下面是一个生成错误的最小示例。如果Chu列表的类型更改为向量,则编译此最小示例 // g++ -std=c++11 -Wall -Wextra -pedantic test.cpp -o test -lboost_program_options -lboost_system #include <vector> #include <boos

我正在尝试解析来自命令行的列表输入

我的课是从向量中派生出来的

编译器抱怨重载验证不明确。 我知道为什么,但不知道如何解决这个问题

请帮忙

下面是一个生成错误的最小示例。如果Chu列表的类型更改为向量,则编译此最小示例

// g++ -std=c++11 -Wall -Wextra -pedantic test.cpp -o test -lboost_program_options -lboost_system

#include <vector>
#include <boost/program_options.hpp>
#include <iostream>
#include <vector>

using namespace std;

class mylist : public vector<int> {
public:
    friend istream &operator>>(istream &is, mylist& l) {
        int val;
        is >> val;
        l.push_back(val);
        return is;
    }
    friend ostream& operator<<(ostream& os, const mylist& l) {
        return os << l[0];
    }
};

int main (int argc, char* argv[])
{
    //vector<int> ch_list; // This works
    mylist ch_list; // This doesn't

    namespace po = boost::program_options;
    po::options_description desc("Allowed options");
    desc.add_options()
        ("ch", po::value<decltype(ch_list)>(&ch_list), "Set channel numbers")
    ;

    po::variables_map vm;
    try {
        po::store(po::parse_command_line(argc, argv, desc), vm);
        po::notify(vm);
    }
    catch (po::error& e) {
        cerr << "ERROR: " << e.what() << "\n";
        return EXIT_FAILURE;
    }
    if (!ch_list.empty())
        cout << ch_list[0] << "\n";

    return EXIT_SUCCESS;
}
//g++-std=c++11-Wall-Wextra-pedantic test.cpp-o test-lboost\u程序选项-lboost\u系统
#包括
#包括
#包括
#包括
使用名称空间std;
类mylist:公共向量{
公众:
friend istream&operator>>(istream&is、mylist&l){
int-val;
is>>val;
l、 推回(val);
回报是;
}
friend ostream&operator您可以使用。您的代码是:

#include <vector>
#include <boost/program_options.hpp>
#include <iostream>
#include <vector>

using namespace std;
namespace po = boost::program_options;

class mylist : public vector<int> {
public:
};

void validate(boost::any& v,
  const vector<string>& values,
  mylist*, int) {
  mylist dvalues;
  for(vector<string>::const_iterator it = values.begin();
    it != values.end();
    ++it) {
    stringstream ss(*it);
    copy(istream_iterator<int>(ss), istream_iterator<int>(),
      back_inserter(dvalues));
    if(!ss.eof()) {
      throw ("Invalid coordinate specification");
    }
  }
  v = mylist(dvalues);
}

int main (int argc, char* argv[])
{
    //vector<int> ch_list; // This works
    mylist ch_list; // This doesn't

    po::options_description desc("Allowed options");
    desc.add_options()
        ("ch", po::value< mylist  >(&ch_list)->multitoken(), "Set channel numbers")
    ;

    po::variables_map vm;
    try {
        po::store(po::parse_command_line(argc, argv, desc), vm);
        po::notify(vm);
    }
    catch (po::error& e) {
        cerr << "ERROR: " << e.what() << "\n";
        return EXIT_FAILURE;
    }

    for (auto cc : ch_list)
      cout << cc << endl;

    return EXIT_SUCCESS;
}
#包括
#包括
#包括
#包括
使用名称空间std;
名称空间po=boost::program\u选项;
类mylist:公共向量{
公众:
};
无效验证(boost::any&v、,
常量向量和值,
mylist*,int){
我的价值观;
对于(vector::const_迭代器it=values.begin();
it!=values.end();
++(it){
stringstream ss(*it);
复制(istream_迭代器(ss),istream_迭代器(),
背向插入器(数据值);
如果(!ss.eof()){
抛出(“无效坐标规范”);
}
}
v=mylist(数据值);
}
int main(int argc,char*argv[])
{
//vector Chu list;//这是可行的
mylist Chu list;//这不是
采购订单:选项描述描述(“允许选项”);
说明添加选项()
(“ch”,po::value(&ch_list)->multitoken(),“设置频道号”)
;
变量映射虚拟机;
试一试{
po::store(po::parse_命令行(argc、argv、desc)、vm);
po::通知(vm);
}
捕获(po::错误和e){
瑟尔
#include <vector>
#include <boost/program_options.hpp>
#include <iostream>
#include <vector>

using namespace std;
namespace po = boost::program_options;

class mylist : public vector<int> {
public:
};

void validate(boost::any& v,
  const vector<string>& values,
  mylist*, int) {
  mylist dvalues;
  for(vector<string>::const_iterator it = values.begin();
    it != values.end();
    ++it) {
    stringstream ss(*it);
    copy(istream_iterator<int>(ss), istream_iterator<int>(),
      back_inserter(dvalues));
    if(!ss.eof()) {
      throw ("Invalid coordinate specification");
    }
  }
  v = mylist(dvalues);
}

int main (int argc, char* argv[])
{
    //vector<int> ch_list; // This works
    mylist ch_list; // This doesn't

    po::options_description desc("Allowed options");
    desc.add_options()
        ("ch", po::value< mylist  >(&ch_list)->multitoken(), "Set channel numbers")
    ;

    po::variables_map vm;
    try {
        po::store(po::parse_command_line(argc, argv, desc), vm);
        po::notify(vm);
    }
    catch (po::error& e) {
        cerr << "ERROR: " << e.what() << "\n";
        return EXIT_FAILURE;
    }

    for (auto cc : ch_list)
      cout << cc << endl;

    return EXIT_SUCCESS;
}