template <typename T>和template <class T>之间有什么区别.对我来说,两者都产生了相同的结果

use*_*266 27 c++ templates

template <typename T> 和之间的区别是什么template <class T>.对我来说,两者都产生了相同的结果.

例如

template <class T>
T Average(T *atArray, int nNumValues)
{
    T tSum = 0;
    for (int nCount=0; nCount < nNumValues; nCount++)
        tSum += atArray[nCount];

    tSum /= nNumValues;
    return tSum;
}
Run Code Online (Sandbox Code Playgroud)

如果我把它改成它 template <typename T>就是一样的

Jam*_*lis 60

没有区别. typename并且class在类型模板参数的声明中是可互换的.

但是,在声明模板模板参数时,您必须使用class(而不是typename):

template <template <typename> class    T> class C { }; // valid!
template <template <typename> typename T> class C { }; // invalid!  o noez!
Run Code Online (Sandbox Code Playgroud)


小智 5

在大多数情况下,它们是等效的和可互换的,并且有些人更喜欢typename,因为在那种情况下使用关键字class似乎很令人困惑。

之所以需要typename是因为在使用template <class T> 此类示例时,您定义了如下模板:

template <class T>
void MyMethod() {
   T::iterator * var;
}
Run Code Online (Sandbox Code Playgroud)

然后由于某种原因,模板的用户决定实例化该类

class TestObject {
   static int iterator; //ambiguous
};

MyMethod<TestObject>(); //error
Run Code Online (Sandbox Code Playgroud)

var应该是什么,类迭代器的实例或静态类型int变得不明确。因此,在这种情况下,引入了typename来强制将模板对象解释为类型。