可能重复:
C++ difference of keywords 'typename' and 'class' in templates
在很多情况下,我已经知道class
无法替换typename
。我只是在谈论相反的事情:用typename
替换class
。
有人指出这里只能使用typename
:
template<class param_t> class Foo
{
typedef typename param_t::baz sub_t;
};
但是我在这里用typename
替换class
没有任何问题(在MSVC中)。
回顾一下,我可以一直用class替换typename吗?如果没有,请举例。
答案 0 :(得分:4)
不,你不能总是用另一个替换一个。
name disambiguation 需要两个关键字typename
和template
,以通知编译器,从属名称是值(无关键字)需要),类型(需要typename
)或模板(需要template
):
template <typename T> struct Foo
{
char bar()
{
int x = T::zing; // value, no decoration for disambiguation of "T::zing"
typedef typename T::bongo Type; // typename, require disambiguation of "T::bongo"
return T::template zip<Type>(x); // template, require disambiguation of "T::zip"
}
};
只有关键字typename
和template
才能在这些角色中发挥作用;你不能用其他任何东西来代替。
答案 1 :(得分:0)
您不能将typename用于模板模板参数:
template <
template <typename> class Container>, // cannot use typename for class
typename T
> struct TestMe
{
Container<T> _data;
// ... etc.
};
这是因为只能对模板进行模板化。