关于c ++:什么时候`typename`不能被`class`取代?

When can `typename` not be replaced by `class`?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
C++ difference of keywords 'typename' and 'class' in templates

我已经知道在很多情况下,class不能被typename取代。我所说的恰恰相反:用class代替typename

有人指出,这里只能使用typename

1
2
3
4
template<class param_t> class Foo
{    
        typedef typename param_t::baz sub_t;
};

但在这里(在MSVC中),用class替换typename没有任何问题。简单地说,我可以用类替换typename吗?如果没有,请举例说明。


不,不能总是用一个替换另一个。

名称消歧需要两个关键字typenametemplate来通知编译器依赖名称是值(不需要关键字)、类型(需要typename还是模板(需要template):

1
2
3
4
5
6
7
8
9
10
11
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"
  }
};

只有关键字typenametemplate在这些角色中起作用;您不能用其他任何东西替换它们。


模板模板参数不能使用typename:

1
2
3
4
5
6
7
8
template <
    template <typename> class Container>, // cannot use typename for class
    typename T
  > struct TestMe
{
    Container<T> _data;
    // ... etc.
};

这是因为只有类可以模板化。