模板之间有什么区别?和模板。对我来说两者都产生相同的结果

发布于 2024-10-21 20:17:47 字数 451 浏览 1 评论 0原文

templatetemplate 之间有什么区别。 对我来说,两者都产生相同的结果。

例如

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 它是相同的

What is difference between template <typename T> and template <class T>.
For me both are generating the same result.

for example

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;
}

if I change it to template <typename T> it's the same

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

我们的影子 2024-10-28 20:17:48

它们在大多数情况下是等效的并且可以互换,有些人更喜欢 typename,因为在该上下文中使用关键字 class 似乎很混乱。

需要 typename 的原因是针对使用 template 时的那些不明确的情况,例如,您定义了这样的模板:

template <class T>
void MyMethod() {
   T::iterator * var;
}

然后由于某种原因,模板的用户决定实例化class as this

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

MyMethod<TestObject>(); //error

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

They're equivalent and interchangeable for most of the times, and some prefer typename because using the keyword class in that context seems confusing.

The reason why typename is needed is for those ambiguous cases when using template <class T> for example, you define a template like this:

template <class T>
void MyMethod() {
   T::iterator * var;
}

and then for some reason the user of your template decides to instantiate the class as this

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

MyMethod<TestObject>(); //error

It becomes ambiguous what var should be, an instance of a class iterator or the static type int. So for this cases typename was introduced to force the template object to be interpreted as a type.

不打扰别人 2024-10-28 20:17:48

看看这个:

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

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

Look at this:

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

They both produce the same behaviour. When you use typename its more readable.

夜唯美灬不弃 2024-10-28 20:17:47

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

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

template <template <typename> class    T> class C { }; // valid!
template <template <typename> typename T> class C { }; // invalid!  o noez!

There is no difference. typename and class are interchangeable in the declaration of a type template parameter.

You do, however, have to use class (and not typename) when declaring a template template parameter:

template <template <typename> class    T> class C { }; // valid!
template <template <typename> typename T> class C { }; // invalid!  o noez!
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文