如何重载运算符<<用于boost :: program_options默认值输出?

时间:2012-03-02 10:45:17

标签: c++ boost boost-program-options

我正在使用boost :: program_options并希望将类似“域”的选项传递给我的程序。这样的域名就是:

template<typename T>
struct CDomain
{
  CDomain(T min = -1, T max = 1) {_min = min; _max = max;};
  T _min;
  T _max;
};

我为这个选项类编写了一个自定义验证器,效果很好。现在我想添加一个默认值,如

desc.add_options()("domain", po::value<CDomain<long double> >()->default_value(CDomain<long double>(-1,1)), "domain");

boost :: program_options调用了一个运算符&lt;&lt;&lt;:

error: no match for ‘operator<<’ in ‘stream << input’

我添加了这个,但仍然收到相同的错误消息:

template<typename T>
ostream& operator<<(ostream& o, CDomain<T>& d)
{
  return o << "[" << boost::lexical_cast<string>(d._min) << ":" << boost::lexical_cast<string>(d._max) << "]";
}

如何定义operator&lt;&lt;用于自定义选项说明中的默认值输出?


我做了一些调查。错误发生在boost/lexical_cast.hpp:1147 In member function bool boost::detail::lexical_stream_limited_src<CharT, Traits, RequiresStringbuffer>::shl_input_streamable(InputStreamable&) [with InputStreamable = const CDomain<long double>, CharT = char, Traits = std::char_traits<char>, bool RequiresStringbuffer = true]

template<typename InputStreamable>
bool shl_input_streamable(InputStreamable& input)
{
    std::basic_ostream<CharT> stream(&stringbuffer);
    bool const result = !(stream << input).fail();
    start = stringbuffer.pbase();
    finish = stringbuffer.pptr();
    return result && (start != finish);
}

这可能是命名空间问题,但将ostream& operator<<(ostream& o, CDomain<T>& d)移动到boost :: detail并没有解决问题。

1 个答案:

答案 0 :(得分:2)

同样重新定义您的结构:

template<typename T>
struct CDomain
{
  CDomain(T min = -1, T max = 1) {_min = min; _max = max;};
  T _min;
  T _max;

  friend std::ostream& operator << (std::ostream& s, const CDomain& domain)
  {
    so << "[" << boost::lexical_cast<string>(d._min) << ":" << boost::lexical_cast<string>(d._max) << "]"
    return s;
  }
};

这应该解决我相信的问题。 Here我认为它有效(修改版本使其在线工作)。