template <typename t =“”>和template <class t =“”>之间有什么区别。对我来说,两者都生成相同的结果</class> </typename>

时间:2011-03-15 02:59:11

标签: 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;
}

如果我将其更改为template <typename T>它是相同的

3 个答案:

答案 0 :(得分:60)

没有区别。 typenameclass在类型模板参数的声明中是可互换的。

但是,在声明模板模板参数时,您必须使用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)

看看这个:

http://www.cplusplus.com/forum/general/8027/

他们都产生相同的行为。当您使用typename时,它更具可读性。