C++ 使用boost::program_选项在命名空间中的类中使用枚举

C++ 使用boost::program_选项在命名空间中的类中使用枚举,c++,boost-program-options,C++,Boost Program Options,我正在使用boost::program_选项解析我的程序的命令行,并且在尝试将值读入命名空间中的类中的公共枚举时遇到问题 具体内容: Boost 1.44.0 g++ 4.4.7 我试着按照中所述的流程进行操作,但对我来说不起作用 参数 #include <istream> namespace SA { class Parameters { public: enum Algorithm { ALGOR

我正在使用boost::program_选项解析我的程序的命令行,并且在尝试将值读入命名空间中的类中的公共枚举时遇到问题

具体内容:

Boost 1.44.0
g++ 4.4.7
我试着按照中所述的流程进行操作,但对我来说不起作用

参数

#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>
     }
}
#包括
名称空间SA
{
类参数
{
公众:
枚举算法
{
算法_1,
算法2,
算法3,
算法4
};
friend istream&operator>>(istream&in,参数::算法和算法);
马尔可夫算法;
}
}
帕迈特斯公司

#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;
}
#包括
使用名称空间SA;
istream和运算符>>(istream和in,参数::算法和算法)
{
字符串标记;
在>>令牌中;
boost::向上移动(令牌);
如果(令牌==“算法_1”)
{
算法=算法_1;
}
else if(令牌==“算法_2”)
{
算法=算法2;
}
else if(令牌==“算法_3”)
{
算法=算法3;
}
else if(令牌==“算法_4”)
{
算法=算法4;
}
其他的
{
抛出boost::程序选项::验证错误(“无效算法”);
}
返回;
}
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>

    <...>
}
#包括
使用名称空间SA;
int main(int argc,字符**argv)
{
po::选项\描述选项(“测试:[选项]\n其中选项为:”);
options.add_选项()
(“algorithm”,po::value(&Parameters::mAlgorithm)->默认值(Parameters::algorithm_3),“algorithm”);
}
编译时,会出现以下错误:

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.o:在函数“bool boost::detail::lexical\u stream\u limited\u src::operator>>(SA::Parameters::Algorithm&)”中:
/usr/include/boost/lexical_cast.hpp:785:对“SA::operator>>(std::basic_istream&,SA::Parameters::Algorithm&)的未定义引用
我试着将操作符>>放在main中,但得到了相同的错误


我已经在这上面花了几天的时间,现在不知道该怎么办。如果有人有任何想法,我们将不胜感激。

通过您的朋友声明,您可以声明

namespace SA {
    istream& operator>> (istream &in, Parameters::Algorithm &algorithm);
}
以及您在全局命名空间中的实现:

istream& operator>> (istream &in, Parameters::Algorithm &algorithm);
将实现移动到
命名空间SA

供您参考:

namespace SA { void foo(); }

using namespace SA;

void foo() {} // implement ::foo and not SA::foo()
你必须使用

namespace SA { void foo() {} }


尝试在
名称空间SA
中定义您的
运算符>
。不幸的是,我的代码所在的计算机不在Internet上,因此我必须在另一台计算机上键入此代码,但忘记输入我的名称空间SA。我编辑了我的原始帖子,以反映它一直在那里。我的答案仍然有效。我已经做了编辑,突出了一些要点。好的。我不知道他们是不同的。它现在起作用了!非常感谢。
void SA::foo() {}