boost::program_选项重载验证不明确
我正在尝试解析来自命令行的列表输入 我的课是从向量中派生出来的 编译器抱怨重载验证不明确。 我知道为什么,但不知道如何解决这个问题 请帮忙 下面是一个生成错误的最小示例。如果Chu列表的类型更改为向量,则编译此最小示例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
// 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;
}