相关疑难解决方法(0)

使用'class'或'typename'作为模板参数?

可能重复:
模板中关键字'typename'和'class'的C++差异

在C++中定义函数模板或类模板时,可以这样写:

template <class T> ...
Run Code Online (Sandbox Code Playgroud)

或者可以这样写:

template <typename T> ...
Run Code Online (Sandbox Code Playgroud)

是否有充分理由偏好一个而不是另一个?


我接受了最受欢迎(也很有趣)的答案,但真正的答案似乎是"不,没有理由偏爱另一个."

  • 它们是等价的(除非如下所述).
  • 有些人有理由一直使用typename.
  • 有些人有理由一直使用class.
  • 有些人有理由同时使用这两种方法.
  • 有些人并不关心他们使用哪一个.

但是,请注意,在模板模板参数的情况下,需要使用class而不是typename.请参阅下面的user1428839的答案.(但这个特殊情况不是偏好问题,而是语言的要求.)(这也会改变typename)

c++ templates

572
推荐指数
8
解决办法
26万
查看次数

为什么当模板类继承自另一个模板类时,需要重新指定typedef并且函数调用是否合格?

当模板类继承自另一个模板类时,必须再次重新定义基类中的typedef(即它们不会自动继承),并且需要限定基类中的函数调用.这是为什么?这不是明确的吗?

因此,如果我有20个模板类,都定义了相同的typedef,我无法引入包含这些定义的基类并从中继承,因为我必须在每个类中重新定义typedef,这会破坏目的.这使得源代码不必要地冗长.

我可以看到这个已经在这个问题中讨论过,但我不明白这个评论

C++名称查找规则指定仅在模板化基类中搜索名称(如果它取决于模板参数(如果它是"依赖名称")).如果名称不依赖于模板参数,则不会在那里搜索.

这是什么原因?对我来说完全是无稽之谈.

也许,下面的代码片段会更好地说明我的问题:

#include <iostream>

template <unsigned N, typename T>
struct A
{
   typedef T U;
   static void foo(T x) { std::cout << N + x << "\n"; }
};

template <unsigned N, typename T>
struct B : public A<N, T>
{
    // Why do I have to redeclare U? Isn't is unambiguous already?
    typedef typename A<N, T>::U U;

    //  why do I have to specify B::? Isn't it unambiguous already?
    static void zoo(U x) …
Run Code Online (Sandbox Code Playgroud)

c++ templates typedef

7
推荐指数
1
解决办法
120
查看次数

标签 统计

c++ ×2

templates ×2

typedef ×1