我正在使用boost :: program_options来解析我的程序的命令行,并且在尝试将值读入也是名称空间的类中的公共枚举时遇到了麻烦。
细节:
Boost 1.44.0
g++ 4.4.7
我尝试遵循Boost Custom Validator for Enum中阐明的过程,但对我不起作用。
参数.h
#include <istream>
namespace SA
{
class Parameters
{
public:
enum Algorithm
{
ALGORITHM_1,
ALGORITHM_2,
ALGORITHM_3,
ALGORITHM_4
};
friend istream& operator>> (istream &in, Parameters::Algorithm &algorithm);
Algorithm mAlgorithm;
<More Parameters>
}
}
Parmaeters.cpp
#include <boost/algorithm/string.hpp>
using namespace SA;
istream& operator>> (istream &in, Parameters::Algorithm &algorithm)
{
string token;
in >> token;
boost::to_upper (token);
if (token == "ALGORITHM_1")
{
algorithm = ALGORITHM_1;
}
else if (token == "ALGORITHM_2")
{
algorithm = ALGORITHM_2;
}
else if (token == "ALGORITHM_3")
{
algorithm = ALGORITHM_3;
}
else if (token == "ALGORITHM_4")
{
algorithm = ALGORITHM_4;
}
else
{
throw boost::program_options::validation_error ("Invalid Algorithm");
}
return in;
}
main.cpp
#include <boost/program_options.hpp>
using namespace SA;
int main (int argc, char **argv)
{
po::options_description options ("Test: [options] <data file>\n Where options are:");
options.add_options ()
("algorithm", po::value<Parameters::Algorithm>(&Parameters::mAlgorithm)->default_value (Parameters::ALGORITHM_3), "Algorithm");
<More options>
<...>
}
编译时,出现以下错误:
main.o: In function 'bool boost::detail::lexical_stream_limited_src<char, std::basic_streambuf<char, std::char_traits<char> >, std::char_traits<char> >::operator>><SA::Parameters::Algorithm>(SA::Parameters::Algorithm&)':
/usr/include/boost/lexical_cast.hpp:785: undefined reference to 'SA::operator>>(std::basic_istream<car, std:char_traits<char> >&, SA::Parameters::Algorithm&)'
我尝试将运算符>>放入main并得到相同的错误。
我现在已经花了几天时间了,所以我不打算从这里去。如果有人有任何想法,将不胜感激。
用您的朋友声明,您声明
namespace SA {
istream& operator>> (istream &in, Parameters::Algorithm &algorithm);
}
而您在全局名称空间中的实现:
istream& operator>> (istream &in, Parameters::Algorithm &algorithm);
将实现移入namespace SA
。
供您参考:
namespace SA { void foo(); }
using namespace SA;
void foo() {} // implement ::foo and not SA::foo()
你必须用
namespace SA { void foo() {} }
或者
void SA::foo() {}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句