'_FCbuild'不能用作函数 - c / c ++代码错误

时间:2017-04-17 11:26:12

标签: c++ boost rtos qnx-neutrino

这是来自Boost库的我的C ++代码。当我尝试使用ARM处理器为我的QNX编译此代码时,它会抛出2个错误 -

  1. '_ FCbuild'不能用作函数
  2. 预期'>'在'('token
  3. 之前

    以下代码

    都会引发错误
    template<class T, std::size_t I, unsigned N>
    struct extent<T[I], N>
    {
       static const std::size_t value = extent<T, N-1>::value;
    };
    

    一切看起来都很好..但不确定为什么它会抛出这个错误..任何人遇到类似的错误并解决了它?

    这是整个代码:

    #ifndef BOOST_MOVE_UNIQUE_PTR_DETAIL_META_UTILS_HPP
    #define BOOST_MOVE_UNIQUE_PTR_DETAIL_META_UTILS_HPP
    
    #ifndef BOOST_CONFIG_HPP
    #  include <boost/config.hpp>
    #endif
    #
    #if defined(BOOST_HAS_PRAGMA_ONCE)
    #  pragma once
    #endif
    
    #include <cstddef>   //for std::size_t
    
    //Small meta-typetraits to support move
    
    namespace boost {
    
    namespace movelib {
    
    template <class T>
    struct default_delete;
    
    }  //namespace movelib {
    
    #ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
    //Forward declare boost::rv
    template <class T> class rv;
    #endif
    
    namespace move_upmu {
    
    //////////////////////////////////////
    //              nat
    //////////////////////////////////////
    struct nat{};
    
    //////////////////////////////////////
    //            natify
    //////////////////////////////////////
    template <class T> struct natify{};
    
    //////////////////////////////////////
    //             if_c
    //////////////////////////////////////
    template<bool C, typename T1, typename T2>
    struct if_c
    {
       typedef T1 type;
    };
    
    template<typename T1, typename T2>
    struct if_c<false,T1,T2>
    {
       typedef T2 type;
    };
    
    //////////////////////////////////////
    //             if_
    //////////////////////////////////////
    template<typename T1, typename T2, typename T3>
    struct if_ : if_c<0 != T1::value, T2, T3>
    {};
    
    //enable_if_
    template <bool B, class T = nat>
    struct enable_if_c
    {
       typedef T type;
    };
    
    //////////////////////////////////////
    //          enable_if_c
    //////////////////////////////////////
    template <class T>
    struct enable_if_c<false, T> {};
    
    //////////////////////////////////////
    //           enable_if
    //////////////////////////////////////
    template <class Cond, class T = nat>
    struct enable_if : public enable_if_c<Cond::value, T> {};
    
    //////////////////////////////////////
    //          remove_reference
    //////////////////////////////////////
    template<class T>
    struct remove_reference
    {
       typedef T type;
    };
    
    template<class T>
    struct remove_reference<T&>
    {
       typedef T type;
    };
    
    #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
    
    template<class T>
    struct remove_reference<T&&>
    {
       typedef T type;
    };
    
    #else
    
    template<class T>
    struct remove_reference< rv<T> >
    {
       typedef T type;
    };
    
    template<class T>
    struct remove_reference< rv<T> &>
    {
       typedef T type;
    };
    
    template<class T>
    struct remove_reference< const rv<T> &>
    {
       typedef T type;
    };
    
    
    #endif
    
    //////////////////////////////////////
    //             remove_const
    //////////////////////////////////////
    template< class T >
    struct remove_const
    {
       typedef T type;
    };
    
    template< class T >
    struct remove_const<const T>
    {
       typedef T type;
    };
    
    //////////////////////////////////////
    //             remove_volatile
    //////////////////////////////////////
    template< class T >
    struct remove_volatile
    {
       typedef T type;
    };
    
    template< class T >
    struct remove_volatile<volatile T>
    {
       typedef T type;
    };
    
    //////////////////////////////////////
    //             remove_cv
    //////////////////////////////////////
    template< class T >
    struct remove_cv
    {
        typedef typename remove_volatile
          <typename remove_const<T>::type>::type type;
    };
    
    //////////////////////////////////////
    //          remove_extent
    //////////////////////////////////////
    template<class T>
    struct remove_extent
    {
       typedef T type;
    };
    
    template<class T>
    struct remove_extent<T[]>
    {
       typedef T type;
    };
    
    template<class T, std::size_t N>
    struct remove_extent<T[N]>
    {
       typedef T type;
    };
    
    //////////////////////////////////////
    //             extent
    //////////////////////////////////////
    
    template<class T, unsigned N = 0>
    struct extent
    {
       static const std::size_t value = 0;
    };
    
    template<class T>
    struct extent<T[], 0> 
    {
       static const std::size_t value = 0;
    };
    
    
    template<class T, std::size_t I, unsigned N>
    struct extent<T[I], N>
    {
       static const std::size_t value = extent<T, N-1>::value;
    };
    
    template<class T, unsigned N>
    struct extent<T[], N>
    {
       static const std::size_t value = extent<T, N-1>::value;
    };
    
    template<class T, std::size_t N>
    struct extent<T[N], 0> 
    {
       static const std::size_t value = N;
    };
    
    //////////////////////////////////////
    //      add_lvalue_reference
    //////////////////////////////////////
    template<class T>
    struct add_lvalue_reference
    {
       typedef T& type;
    };
    
    template<class T>
    struct add_lvalue_reference<T&>
    {
       typedef T& type;
    };
    
    template<>
    struct add_lvalue_reference<void>
    {
       typedef void type;
    };
    
    template<>
    struct add_lvalue_reference<const void>
    {
       typedef const void type;
    };
    
    template<>
    struct add_lvalue_reference<volatile void>
    {
       typedef volatile void type;
    };
    
    template<>
    struct add_lvalue_reference<const volatile void>
    {
       typedef const volatile void type;
    };
    
    template<class T>
    struct add_const_lvalue_reference
    {
       typedef typename remove_reference<T>::type   t_unreferenced;
       typedef const t_unreferenced                 t_unreferenced_const;
       typedef typename add_lvalue_reference
          <t_unreferenced_const>::type              type;
    };
    
    //////////////////////////////////////
    //             is_same
    //////////////////////////////////////
    template<class T, class U>
    struct is_same
    {
       static const bool value = false;
    };
    
    template<class T>
    struct is_same<T, T>
    {
       static const bool value = true;
    };
    
    //////////////////////////////////////
    //             is_pointer
    //////////////////////////////////////
    template< class T >
    struct is_pointer
    {
        static const bool value = false;
    };
    
    template< class T >
    struct is_pointer<T*>
    {
        static const bool value = true;
    };
    
    //////////////////////////////////////
    //             is_reference
    //////////////////////////////////////
    template< class T >
    struct is_reference
    {
        static const bool value = false;
    };
    
    template< class T >
    struct is_reference<T&>
    {
        static const bool value = true;
    };
    
    #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
    
    template< class T >
    struct is_reference<T&&>
    {
        static const bool value = true;
    };
    
    #endif
    
    //////////////////////////////////////
    //             is_lvalue_reference
    //////////////////////////////////////
    template<class T>
    struct is_lvalue_reference
    {
        static const bool value = false;
    };
    
    template<class T>
    struct is_lvalue_reference<T&>
    {
        static const bool value = true;
    };
    
    //////////////////////////////////////
    //          is_array
    //////////////////////////////////////
    template<class T>
    struct is_array
    {
       static const bool value = false;
    };
    
    template<class T>
    struct is_array<T[]>
    {
       static const bool value = true;
    };
    
    template<class T, std::size_t N>
    struct is_array<T[N]>
    {
       static const bool value = true;
    };
    
    //////////////////////////////////////
    //          has_pointer_type
    //////////////////////////////////////
    template <class T>
    struct has_pointer_type
    {
       struct two { char c[2]; };
       template <class U> static two test(...);
       template <class U> static char test(typename U::pointer* = 0);
       static const bool value = sizeof(test<T>(0)) == 1;
    };
    
    //////////////////////////////////////
    //             pointer_type
    //////////////////////////////////////
    template <class T, class D, bool = has_pointer_type<D>::value>
    struct pointer_type_imp
    {
        typedef typename D::pointer type;
    };
    
    template <class T, class D>
    struct pointer_type_imp<T, D, false>
    {
        typedef typename remove_extent<T>::type* type;
    };
    
    template <class T, class D>
    struct pointer_type
    {
        typedef typename pointer_type_imp
          <typename remove_extent<T>::type, typename remove_reference<D>::type>::type type;
    };
    
    //////////////////////////////////////
    //           is_convertible
    //////////////////////////////////////
    #if defined(_MSC_VER) && (_MSC_VER >= 1400)
    
    //use intrinsic since in MSVC
    //overaligned types can't go through ellipsis
    template <class T, class U>
    struct is_convertible
    {
       static const bool value = __is_convertible_to(T, U);
    };
    
    #else
    
    template <class T, class U>
    class is_convertible
    {
       typedef typename add_lvalue_reference<T>::type t_reference;
       typedef char true_t;
       class false_t { char dummy[2]; };
       static false_t dispatch(...);
       static true_t  dispatch(U);
       static t_reference       trigger();
       public:
       static const bool value = sizeof(dispatch(trigger())) == sizeof(true_t);
    };
    
    #endif
    
    //////////////////////////////////////
    //       is_unary_function
    //////////////////////////////////////
    #if defined(BOOST_MSVC) || defined(__BORLANDC_)
    #define BOOST_MOVE_TT_DECL __cdecl
    #else
    #define BOOST_MOVE_TT_DECL
    #endif
    
    #if defined(_MSC_EXTENSIONS) && !defined(__BORLAND__) && !defined(_WIN64) && !defined(_M_ARM) && !defined(UNDER_CE)
    #define BOOST_MOVE_TT_TEST_MSC_FUNC_SIGS
    #endif
    
    template <typename T>
    struct is_unary_function_impl
    {  static const bool value = false; };
    
    // avoid duplicate definitions of is_unary_function_impl
    #ifndef BOOST_MOVE_TT_TEST_MSC_FUNC_SIGS
    
    template <typename R>
    struct is_unary_function_impl<R (*)()>
    {  static const bool value = true;  };
    
    template <typename R>
    struct is_unary_function_impl<R (*)(...)>
    {  static const bool value = true;  };
    
    #else // BOOST_MOVE_TT_TEST_MSC_FUNC_SIGS
    
    template <typename R>
    struct is_unary_function_impl<R (__stdcall*)()>
    {  static const bool value = true;  };
    
    #ifndef _MANAGED
    
    template <typename R>
    struct is_unary_function_impl<R (__fastcall*)()>
    {  static const bool value = true;  };
    
    #endif
    
    template <typename R>
    struct is_unary_function_impl<R (__cdecl*)()>
    {  static const bool value = true;  };
    
    template <typename R>
    struct is_unary_function_impl<R (__cdecl*)(...)>
    {  static const bool value = true;  };
    
    #endif
    
    // avoid duplicate definitions of is_unary_function_impl
    #ifndef BOOST_MOVE_TT_TEST_MSC_FUNC_SIGS
    
    template <typename R, class T0>
    struct is_unary_function_impl<R (*)(T0)>
    {  static const bool value = true;  };
    
    template <typename R, class T0>
    struct is_unary_function_impl<R (*)(T0...)>
    {  static const bool value = true;  };
    
    #else // BOOST_MOVE_TT_TEST_MSC_FUNC_SIGS
    
    template <typename R, class T0>
    struct is_unary_function_impl<R (__stdcall*)(T0)>
    {  static const bool value = true;  };
    
    #ifndef _MANAGED
    
    template <typename R, class T0>
    struct is_unary_function_impl<R (__fastcall*)(T0)>
    {  static const bool value = true;  };
    
    #endif
    
    template <typename R, class T0>
    struct is_unary_function_impl<R (__cdecl*)(T0)>
    {  static const bool value = true;  };
    
    template <typename R, class T0>
    struct is_unary_function_impl<R (__cdecl*)(T0...)>
    {  static const bool value = true;  };
    
    #endif
    
    template <typename T>
    struct is_unary_function_impl<T&>
    {  static const bool value = false; };
    
    template<typename T>
    struct is_unary_function
    {  static const bool value = is_unary_function_impl<T>::value;   };
    
    //////////////////////////////////////
    //       has_virtual_destructor
    //////////////////////////////////////
    #if (defined(BOOST_MSVC) && defined(BOOST_MSVC_FULL_VER) && (BOOST_MSVC_FULL_VER >=140050215))\
             || (defined(BOOST_INTEL) && defined(_MSC_VER) && (_MSC_VER >= 1500))
    #  define BOOST_MOVEUP_HAS_VIRTUAL_DESTRUCTOR(T) __has_virtual_destructor(T)
    #elif defined(BOOST_CLANG) && defined(__has_feature)
    #  if __has_feature(has_virtual_destructor)
    #     define BOOST_MOVEUP_HAS_VIRTUAL_DESTRUCTOR(T) __has_virtual_destructor(T)
    #  endif
    #elif defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3) && !defined(__GCCXML__))) && !defined(BOOST_CLANG)
    #  define BOOST_MOVEUP_HAS_VIRTUAL_DESTRUCTOR(T) __has_virtual_destructor(T)
    #elif defined(__ghs__) && (__GHS_VERSION_NUMBER >= 600)
    #  define BOOST_MOVEUP_HAS_VIRTUAL_DESTRUCTOR(T) __has_virtual_destructor(T)
    #elif defined(__CODEGEARC__)
    #  define BOOST_MOVEUP_HAS_VIRTUAL_DESTRUCTOR(T) __has_virtual_destructor(T)
    #endif
    
    #ifdef BOOST_MOVEUP_HAS_VIRTUAL_DESTRUCTOR
       template<class T>
       struct has_virtual_destructor{   static const bool value = BOOST_MOVEUP_HAS_VIRTUAL_DESTRUCTOR(T);  };
    #else
       //If no intrinsic is available you trust the programmer knows what is doing
       template<class T>
       struct has_virtual_destructor{   static const bool value = true;  };
    #endif
    
    //////////////////////////////////////
    //       missing_virtual_destructor
    //////////////////////////////////////
    
    template< class T, class U
            , bool enable =  is_convertible< U*, T*>::value &&
                            !is_array<T>::value &&
                            !is_same<typename remove_cv<T>::type, void>::value &&
                            !is_same<typename remove_cv<U>::type, typename remove_cv<T>::type>::value
            >
    struct missing_virtual_destructor_default_delete
    {  static const bool value = !has_virtual_destructor<T>::value;  };
    
    template<class T, class U>
    struct missing_virtual_destructor_default_delete<T, U, false>
    {  static const bool value = false;  };
    
    template<class Deleter, class U>
    struct missing_virtual_destructor
    {  static const bool value = false;  };
    
    template<class T, class U>
    struct missing_virtual_destructor< ::boost::movelib::default_delete<T>, U >
       : missing_virtual_destructor_default_delete<T, U>
    {};
    
    }  //namespace move_upmu {
    }  //namespace boost {
    
    #endif //#ifndef BOOST_MOVE_UNIQUE_PTR_DETAIL_META_UTILS_HPP
    

1 个答案:

答案 0 :(得分:0)

只需添加

#undef I

在Boost使用I作为模板参数的任何地方之前,您会收到此错误。 问题是QNX complex.h定义了一个名为I的宏,Boost在某些标题中使用I作为模板参数:

template<class T, std::size_t I, unsigned N>

编译器将I替换为来自complex.h的宏定义。

我在博客文章中详细讨论了这个问题: https://cppisland.wordpress.com/2018/03/04/compiling-boost-on-qnx-a-tale-of-why-modules-are-needed-in-c/