我想以boost program_options方式保存我的应用程序的设置(在文件中)
这是我的功能
void MainWindow::saveSettings()
{
po::options_description desc("Allowed options");
desc.add_options()
("ip",deImPath->text().toStdString().c_str())
("cp",deCalPath->text().toStdString().c_str())
("sp",deSolPath->text().toStdString().c_str());
po::variables_map vm;
po::store(po::parse_config_file("settings.conf",desc),vm);
po::notify(vm);
}
不幸的是我收到了这个错误:
error C2784: 'boost::program_options::basic_parsed_options<charT>
boost::program_options::parse_config_file(std::basic_istream<charT> &,
const boost::program_options::options_description &,bool)' :
could not deduce template argument for 'std::basic_istream<charT> &' from 'const char [14]'
我该如何解决这个问题?
答案 0 :(得分:3)
boost :: program_options的目的是将参数传递给你的程序。
如果您想存储程序可以编写的配置,您可以使用Boost.PropertyTree或Qt的QSettings类。
答案 1 :(得分:1)
我和Boost 1.49有同样的问题。
目前没有提及basic_parsed_options<charT>
parse_config_file(const char* filename, const options_description&,
bool allow_unregistered = false);
版本(http://www.boost.org/doc/libs/1_54_0/doc/html/boost/program_options/parse_config_f_idp87054352.html)。我用像这样的std :: ifstream解决了这个问题
po::variables_map options;
po::options_description desc;
desc.add_options()
("max_processing_time", po::value<double>()->required(), "Maximum processing time")
("min_processing_time", po::value<double>()->required(), "Minimum processing time")
("relative_range_of_due_dates", po::value<double>()->required(), "RDD Relative Range of Due Dates")
("tardiness_factor", po::value<double>()->required(), "TF Tardines Factor")
("number_of_jobs", po::value<unsigned int>()->required(), "Number of jobs");
std::ifstream file(filename.c_str());
po::store(po::parse_config_file(file, desc), options);
file.close();
po::notify(options);
之后,您可以使用
访问这些值max_processing_time_ = options["max_processing_time"].as<double>();
min_processing_time_ = options["min_processing_time"].as<double>();
relative_range_of_due_dates_ = options["relative_range_of_due_dates"].as<double>();
tardiness_factor_ = options["tardiness_factor"].as<double>();
number_of_jobs_ = options["number_of_jobs"].as<unsigned int>();
答案 2 :(得分:1)
根据我的观点,它不是Boost问题 - 在这种情况下,它在Windows上的Unicode字符串转换问题:windows文件名必须是ANSI字符串。如果在Visual Studio中使用Unicode charset选项,则需要帮助Boost <char>
。
void MainWindow::saveSettings()
{
po::options_description desc("Allowed options");
desc.add_options()
("ip",deImPath->text().toStdString().c_str())
("cp",deCalPath->text().toStdString().c_str())
("sp",deSolPath->text().toStdString().c_str());
po::variables_map vm;
po::store(po::parse_config_file<char>("settings.conf",desc),vm);
po::notify(vm);
}