我已經定義了一個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
當然,總是使'static_cast'。否則無意義的複製 –
sehe