2016-04-07 24 views
1

ben basit güç ifade (daha büyük bir ayrıştırıcı minimal örnek) ayrıştırır Boost Ruh kullanarak matematiksel bir ifade ayrıştırıcı yazdı GCC 4.8.4 ve Clang 3.9, ancak Intel derleyici (sürüm 12.1.6) kullanarak derleme yaparken büyük bir derleme hatası verir. derleyici çıkışın ilgili kısmıBoost :: Ruh ve Intel derleyici derleme hatası

/user/home/gent/vsc408/vsc40826/boost_1_60_0/build/include/boost/utility/result_of.hpp(189): error: too few arguments for class template "power_::result" 
    struct result_of_nested_result : F::template result<FArgs> 

Bu http://www.boost.org/doc/libs/1_56_0/libs/utility/utility.htm#result_of tarafından belirtildiği gibi, boost :: result_of ve C++ 11 ile ilgili bir sorun işaret gibi görünüyor olduğunu. Ben struct power_ tanımını değiştirmek Ancak,: derleme daha sonra ilk ruhu dahil başarısız olarak,

herhangi ruhu önce #define BOOST_RESULT_OF_USE_DECLTYPE ekleme
/user/home/gent/vsc408/vsc40826/boost_1_60_0/build/include/boost/phoenix/core/detail/preprocessed/function_eval_10.hpp(135): error: initial value of reference to non-const must be an lvalue 
        return boost::phoenix::eval(f, ctx)(help_rvalue_deduction(boost::phoenix::eval(a0, ctx)) , help_rvalue_deduction(boost::phoenix::eval(a1, ctx))); 

ya da yardımcı olmuyor içerir:

struct power_ { 
    template <class> struct result; 

    template <class F, typename X, typename Y> 
    struct result < F(X, Y) > { 
     typedef X type; 
    }; 

    template <typename X, typename Y> X operator()(X x, Y y) const { 
     return std::pow(x, y); 
    } 
}; 

Hala hata alıyorum .

Bu sorunu nasıl çözeceğini bilen var mı?

+0

Sorun, yalnızca Boost sürümleri 1.56'dan daha büyük olan durumlarda ortaya çıkar. –

cevap

1

Tamam, sadece bunu anladım. Boost :: Phoenix referansla geri dönmek üzere görünüşte değişti. struct power_'un aşağıdaki sürümü çalışır:

struct power_ { 
    template <class> struct result; 

    template <class F, typename X, typename Y> 
    struct result < F(X, Y) > { 
     typedef X& type; 
    }; 

    template <typename X, typename Y> X& operator()(X &x, Y y) const { 
     x = std::pow(x, y); 
     return x; 
    } 
};