在示例(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>
- 用 MyClass 替换所有出现的 magic_number。
- 注释掉验证中的所有代码。
- 这不编译。
编辑:添加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)
{
}
编辑:它可能与命名空间有关。
在我用 包围 validate 函数后namespace boost { namespace program_options { }}
,编译的代码没有重载 op>>。如果将 validate 放入与 MyClass 相同的命名空间中,它也可以工作。谁能解释一下?