2010-07-25 80 views
1

我在boost的program_options(版本1.42)上寫下面的代碼。這看起來很簡單,幾乎和教程中的一樣。但是,我收到「multiple_occurrences」錯誤。進一步的調查發現它(可能)是引發它的「文件名」參數。「多次發生」異常的boost program_options

我給的參數是:

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); 
+0

複製並粘貼錯誤消息的* exact *文本。 – 2010-07-25 17:24:28

+0

沒有,只有「多次出現」。 – 2010-07-25 18:11:36

回答

5

EDIT

的第二個參數po::positional_options_description::addmax 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的鏈接,以及如果您不想升級或無法升級升級副本的補丁。要使用新功能,請執行如下操作:

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; 
} 
+0

1.42。 我已經知道什麼是有問題的選項 - 它是「文件名」。我只是不知道這是什麼原因。 – 2010-07-25 23:14:34

+0

也許你的位置選項?發佈您試圖解析的參數。 – 2010-07-26 04:31:07

+0

我更新了帖子。 – 2010-07-26 09:53:12