C ++ 11模板代码 - 无法在XCode中编译

时间:2017-04-19 18:25:44

标签: c++ xcode c++11

我有这段代码:

template<bool, class _Ty1, class _Ty2> struct MyIf
{   // type is _Ty2 for assumed false
    typedef _Ty2 type;
};

template<class _Ty1, class _Ty2> struct MyIf<true, _Ty1, _Ty2>
{   // type is _Ty1 for assumed true
    typedef _Ty1 type;
};

template<class _Ty>
struct my_decay
{
    // determines decayed version of _Ty
    typedef typename std::decay<_Ty>::type _Ty1;

    typedef typename MyIf<
        std::is_arithmetic<_Ty1>::value, typename _Ty1, //(1)
        typename MyIf<
            std::is_same<LuaString, _Ty1>::value, typename _Ty1, //(2)

        typename _Ty //(3)
        >::type
    >::type type;
};

在Visual Studio 2015下,它编译得很好。但是,当我将代码移植到XCode时,我收到了以下错误:

  
      
  • for(1)=&gt;在&#34; typename&#34;
  • 之后需要一个合格的名字   
  • for(2)=&gt;类型名称不允许指定存储类
  •   
  • for(3)=&gt;类型名称不允许指定存储类
  •   

在Xcode中,我将C ++语言拨号设置为GNU ++ 14,C ++标准库设置为C ++ 11支持,使用的编译器是Apple LLVM 8.1。

1 个答案:

答案 0 :(得分:2)

my_decay Ty_Ty1不是限定名称。这意味着您不需要对它们使用typename。看起来MSVS允许您出于某种原因这样做。要么它是一个bug,要么认为它是一个“功能”,所以人们可以在任何地方喷洒typename来使它工作。正确的版本应该是:

template<class _Ty>
struct my_decay
{
    // determines decayed version of _Ty
    typedef typename std::decay<_Ty>::type _Ty1;

    typedef typename MyIf<
        std::is_arithmetic<_Ty1>::value, _Ty1, //(1)
        typename MyIf<
            std::is_same<void, _Ty1>::value, _Ty1, //(2)

        _Ty //(3)
        >::type
    >::type type;
};

此外,您应该远离在标识符中使用前导下划线。系统保留一个前导下划线后跟一个大写字母,以及所有带有双下划线的标识符。