我有这段代码:
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。
答案 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;
};
此外,您应该远离在标识符中使用前导下划线。系统保留一个前导下划线后跟一个大写字母,以及所有带有双下划线的标识符。