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

C++11 templates code - failed to compile in XCode

本文关键字:XCode 编译 代码      更新时间:2023-10-16

我有此代码:

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(=>期望在" typeName"之后获得合格的名称
  • for(2(=>类型名称不允许指定存储类
  • for(3(=>类型名称不允许指定存储类

在Xcode中,我将C laguage Dialcet设置为gnu 14,C 标准库至C 11支持和使用的编译器是Apple LLVM 8.1。

my_decay Ty_Ty1中的

不是合格的名称。这意味着您无需在它们上使用typename。由于某种原因,MSV似乎允许您这样做。要么是一个错误,要么他们认为它是"功能",因此人们可以在任何地方喷洒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;
};

此外,您应该远离标识符中使用领先的下强调。领先的下划线随后是大写字母,以及所有具有双重下划线的标识符。