我已经定义了一个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
这有没有关系升压,strong_typedef或精神。
它有很多事情要做型扣模板参数。 总之,当参数类型推导,隐式转换从未发生[1]
参见:
#include <iostream>
#include <string>
#include <boost/strong_typedef.hpp>
BOOST_STRONG_TYPEDEF(double, X)
int main() { std::cout << X(); }
没问题! 更换double
用std::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