gpt4 book ai didi

C++11 模板代码 - 在 XCode 中编译失败

转载 作者:搜寻专家 更新时间:2023-10-31 02:11:29 26 4
gpt4 key购买 nike

我有这个代码:

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) => Expected a qualified name after "typename"
  • for (2) => Type name does not allow storage class to be specified
  • for (3) => Type name does not allow storage class to be specified

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

最佳答案

my_decay 中,Ty_Ty1 不是限定名称。这意味着您不需要对它们使用 typename。看起来 MSVS 似乎出于某种原因允许您这样做。要么它是一个错误,要么他们认为它是一个“功能”,所以人们可以随处喷洒 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;
};

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

关于C++11 模板代码 - 在 XCode 中编译失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43503419/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com