2014-02-14 4 views
3

명령 줄에서 목록 입력을 구문 분석하려고합니다.boost :: program_options 오버로드 된 유효성 검사가 모호합니다.

내 클래스는 벡터

컴파일러는 오버로드 유효성을 모호한 것에 대해 불만을

에서 파생됩니다. 그 이유를 알 수 있지만이 문제를 해결하는 방법을 모르겠습니다.

도와주세요.

다음은 오류를 생성하는 최소한의 예입니다. ch_list 유형이 벡터로 변경되면이 최소 예가 컴파일됩니다. 이러한 오류가

/usr/include/boost/program_options/detail/value_semantic.hpp: In instantiation of ‘void boost::program_options::typed_value<T, charT>::xparse(boost::any&, const std::vector<std::basic_string<charT> >&) const [with T = mylist; charT = char]’: 
test.cpp:47:5: required from here 
/usr/include/boost/program_options/detail/value_semantic.hpp:169:13: error: call of overloaded ‘validate(boost::any&, const std::vector<std::basic_string<char> >&, mylist*, int)’ is ambiguous 
/usr/include/boost/program_options/detail/value_semantic.hpp:169:13: note: candidates are: 
/usr/include/boost/program_options/detail/value_semantic.hpp:81:10: note: void boost::program_options::validate(boost::any&, const std::vector<std::basic_string<charT> >&, T*, long int) [with T = mylist; charT = char] 
/usr/include/boost/program_options/detail/value_semantic.hpp:129:10: note: void boost::program_options::validate(boost::any&, const std::vector<std::basic_string<charT> >&, std::vector<_RealType>*, int) [with T = int; charT = char] 

답변

0

당신은 custom validator을 사용할 수 있습니다

// 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; 
} 

내가 얻을. 코드는 다음과 같습니다

#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; 
} 

참조 : boost::program_options config file option with multiple tokens