对于BOOST_STRONG_TYPEDEF和BOOST_SPIRIT_DEBUG_NODE隐式转换

2019-10-17 15:28发布

我已经定义了一个boost ::精神::齐规则:

boost::spirit::qi::rule<Iterator, Identifier()> id;

其中标识符被定义为:

BOOST_STRONG_TYPEDEF(std::string, Identifier)

但是当我使用

BOOST_SPIRIT_DEBUG_NODE(id);

它失败,以下错误编译:

boost_1_51_0/boost/spirit/home/support/attributes.hpp:1203: error: no match for 'operator<<' in 'out << val'

它列出的ostream的重载运算符。

明知BOOST_STRONG_TYPEDEF定义转换运算符原始类型,不应编译器隐从标识符投用时的std :: string operator<< ? 或者是有防止编译器应用类型的转换运算符时,它试图匹配其他运营商(即限制operator<< )?

当我定义下面操作它编译:

inline std::ostream& operator<<(std::ostream& os, const Identifier& id)
{
    return os << static_cast<std::string const&>(id);
}

我使用gcc4.4.2

Answer 1:

这有没有关系升压,strong_typedef或精神。

它有很多事情要做型扣模板参数。 总之,当参数类型推导,隐式转换从未发生[1]

参见:

#include <iostream>
#include <string>
#include <boost/strong_typedef.hpp>

BOOST_STRONG_TYPEDEF(double, X)
int main() { std::cout << X(); }

没问题! 更换doublestd::string ,它不工作了。 有什么不同?

流媒体运营商的声明有所不同。

对比

ostream& ostream::operator<<(double);

template<typename _CharT, typename _Traits, typename _Alloc>
   inline basic_ostream<_CharT, _Traits>&
   operator<<(basic_ostream<_CharT, _Traits>&, basic_string<_CharT, _Traits, _Alloc> const&)

该运算符重载是一个函数模板的事实不允许任何隐式转换。


[1]我想initializer_list可能看起来好像有点例外的在这里,有什么用加宽/缩小,它可以做。 不同的主题,虽然



文章来源: Implicit cast doesnt work for BOOST_STRONG_TYPEDEF and BOOST_SPIRIT_DEBUG_NODE