2011-03-13 21 views
1

在我的規則之一中有一個以stl容器作爲參數的qi :: locals <>。當我編譯我的程序沒有BOOST_SPIRIT_QI_DEBUG時,一切正常。但是當我打開BOOST_SPIRIT_QI_DEBUG時,程序無法編譯,因爲缺少運算符< <。如何定義boost :: spirit :: qi和std :: list容器的流式運算符

簡單的代碼片段:

typedef std::list<int> TlstValues; 

template <typename Iterator, typename Skipper> 
struct G_test : qi::grammar<Iterator, Skipper> 
{ 
    ... 
    G_test() : G_test::base_type(rule_test) 
    { 
    ... 
    BOOST_SPIRIT_DEBUG_NODE(rule_test); 
    } 

    qi::rule<Iterator, qi::locals<TlstValues>, Skipper> rule_test; 
} 

錯誤:

error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'TlstExpressionItems' (or there is no acceptable conversion) 

我試圖定義流運營商TlstValues,但沒有效果。錯誤仍然是一樣的。我的操作定義:

std::ostream& operator << (std::ostream& os, TlstValues & z) 
{ 
return os; 
} 

可有人請告訴我如何定義所需的操作人員進行BOOST_SPIRIT_DEBUG工作?

感謝和問候 裏克

回答

2

迫使ADL找到自己的流媒體運營商是把它放進std命名空間的最簡單方法:

namespace std 
{ 
    std::ostream& operator<< (std::ostream& os, TlstValues& z) 
    { 
     // do your stuff here 
     return os; 
    } 
} 

是的,我知道,這是正式不允許。然而,從實用的角度來看,它仍然是最簡單的方法。

的標準符合性解決方案是專門靈定製點print_attribute_debug您的屬性類型:

// your specialization needs to be in namespace boost::spirit::traits 
namespace boost { namespace spirit { namespace traits 
{ 
    template <typename Out> 
    struct print_attribute_debug<Out, TlstValues> 
    { 
     static void call(Out& out, TlstValues const& val) 
     { 
      // do your output here; Out is a std::ostream 
     } 
    }; 
}}} 
+0

謝謝!我嘗試了一個std命名空間的解決方案,它的工作原理。謝謝。 – Rick 2011-03-13 08:45:17

相關問題