这在 VS2010sp1 中无法编译(不过它可以使用 gcc 4.6 进行编译):
template<class T>
struct Upcast;
template<>
struct Upcast<signed char>
{
typedef signed short type;
};
template<>
struct Upcast<char>
{
typedef typename std::conditional<std::is_signed<char>::value,short, unsigned short>::type type;
};
int main()
{
Upcast<char>::type a;
return 0;
}
VS 的错误:
Error 1 error C2899: typename cannot be used outside a template declaration
哪个团队是正确的? VS 还是 gcc?
VS 在 C++03 上是正确的。 GCC 在 C++0x 上是正确的。
现在,GCC 在 C++03 模式下也允许这样做可能是明智的(有很多真正的编译器在 C++03 模式下无法诊断的事情实际上只在 C++0x 中有效),并且它可能是- VS 在 C++03 模式下拒绝它是明智的。
是否使用已经不重要了typename QualifiedName
在 C++0x 中是否发生在模板中。也就是说,以下内容对于 C++0x 是完全合法的:
#include<vector>
int main() {
typename std::vector<int> v;
}
在 C++03 中,typename
只能在模板内部使用。并且代码中的显式专业化不是模板。没有template<typename T ...>
子句(代码中的所有参数都是固定的)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)