【问题标题】:How to overload operator<< for use with boost::program_options default value output?如何重载 operator<< 以与 boost::program_options 默认值输出一起使用?
【发布时间】:2012-03-02 10:45:17
【问题描述】:

我正在使用 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 为操作员调用

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) << "]";
}

如何定义运算符


我做了更多调查。错误发生在boost/lexical_cast.hpp:1147 In member function bool boost::detail::lexical_stream_limited_src&lt;CharT, Traits, RequiresStringbuffer&gt;::shl_input_streamable(InputStreamable&amp;) [with InputStreamable = const CDomain&lt;long double&gt;, CharT = char, Traits = std::char_traits&lt;char&gt;, 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&amp; operator&lt;&lt;(ostream&amp; o, CDomain&lt;T&gt;&amp; d) 移动到 boost::detail 并没有解决问题。

【问题讨论】:

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


    【解决方案1】:

    同样重新定义你的结构:

    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我看到它工作了(修改版本使其可以在线工作)。

    【讨论】:

    • 操作员按照我定义的方式工作——我可以在任何我想要的地方调用它。问题是 boost 想要 operator
    • 你有没有试过这种方式,看看是否有什么不同?你在哪里定义了operator &lt;&lt; 函数?它是在您希望在哪里使用它之前定义的吗?
    • 我首先尝试过但没有成功,但现在编写了最少的代码再次测试它,一切都很好。谢谢!我只是不明白为什么非朋友课外运算符
    • 我最好的猜测是,您可能没有在 boost 实际需要它之前定义它,这可能在它的头文件之一中。包含顺序的更改可能会产生这种差异。
    猜你喜欢
    • 2016-01-30
    • 1970-01-01
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 2019-05-05
    • 1970-01-01
    • 2019-06-13
    相关资源
    最近更新 更多