В примере (regex.cpp ), автор библиотеки создал пользовательскую структуру (magic_number) и функцию проверки для этой структуры, чтобы показать, как пользовательскую структуру можно интегрировать в параметры программы. Я последовал его примеру, чтобы создать функцию проверки для пользовательского класса (MyClass). Компилятор жалуется, что lexical_cast недоступен для MyClass. Затем я реализовал std::istream& operator>>(std::istream& in, MyClass& d)
, удалил void validate(.., MyClass*, ..)
, код компилируется. Кто-нибудь может объяснить, почему в примере не требуется operator>>
, а в моем не требуется validate
?
РЕДАКТИРОВАТЬ:
#include <MyLib/MyClass.h>
std::istream& operator>>(std::istream& in, MyClass& obj) {
// some code to populate obj
return in;
}
po::variables_map parseCommandLine(int argc, char* argv[]) {
po::options_description options("Options");
options.add_options()
("help", "produce help message")
("obj", po::value<MyClass>(), "")
;
po::variables_map vm;
store(po::command_line_parser(argc, argv)
.options(options).run(), vm);
notify(vm);
return vm;
}
int main(int argc, char* argv[]) {
try {
po::variables_map vm = parseCommandLine(argc, argv);
MyClass obj = vm["my"].as<MyClass>();
cout << obj << endl;
} catch(std::exception& e) {
cout << e.what() << "\n";
return 1;
}
return 0;
}
- код компилируется без проверки.
Я также попытался внести минимальные изменения в regex.cpp:
- удалить magic_number
- добавить
#include <MyLib/MyClass.h>
- замените все вхождения magic_number на MyClass.
- закомментируйте весь код в validate.
- Это не компилируется.
РЕДАКТИРОВАТЬ: добавить validate
. Ни один из них не решил ошибку компилятора.
void validate(boost::any& v,
const std::vector<std::string>& values,
std::vector<MyClass>*, int)
{
}
void validate(boost::any& v,
const std::vector<std::string>& values,
MyClass*, long)
{
}
void validate(boost::any& v,
const std::vector<std::string>& values,
MyClass*, int)
{
}
РЕДАКТИРОВАТЬ: это может относиться к пространствам имен.
После того, как я окружил функцию проверки namespace boost { namespace program_options { }}
, код скомпилировался без перегрузки op>>. Это также работает, если validate находится в том же пространстве имен, что и MyClass. Кто-нибудь может это объяснить?
program_options
? Если проверки нет, невозможно проанализировать объект безop>>
. - person J.N.   schedule 21.11.2012