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;
}
如果我将其更改为template <typename T>
它是相同的
答案 0 :(得分:60)
没有区别。 typename
和class
在类型模板参数的声明中是可互换的。
但是,在声明模板模板参数时,您必须使用class
(而不是typename
):
template <template <typename> class T> class C { }; // valid!
template <template <typename> typename T> class C { }; // invalid! o noez!
答案 1 :(得分:4)
它们在大多数情况下是等效的和可互换的,有些人更喜欢typename,因为在该上下文中使用关键字class似乎令人困惑。
需要typename的原因是在使用template <class T>
时出现这些模棱两可的情况,例如,您定义了这样的模板:
template <class T>
void MyMethod() {
T::iterator * var;
}
然后由于某种原因,模板的用户决定将该类实例化为此
class TestObject {
static int iterator; //ambiguous
};
MyMethod<TestObject>(); //error
变量应该是什么,类迭代器的实例或静态类型int变得模糊不清。因此,对于这种情况,引入了typename以强制将模板对象解释为类型。
答案 2 :(得分:1)