相关疑难解决方法(0)

为什么模板模板参数不允许在参数列表后面加上'typename'

模板模板typename?

当使用模板模板语法时template <template <typename> class T>,需要使用关键字class,因为using typename会给出以下行的错误:

错误:模板模板参数在参数列表后面需要'class'

在其他地方的关键字typename,并class 在声明模板参数的基本情况互换.

您可以争辩说使用模板模板时的要求是提示您应该传递类类型,但情况并非总是如此(特别是在C++ 11引入模板化类型别名之后).

template <template <typename> class T> // 'class' keyword required.
struct Foo {
    using type = T<int>;
};

template <typename T>
using type = T (*)();

using func_ptr_t = Foo<type>::type;
Run Code Online (Sandbox Code Playgroud)

这背后的原因是什么?

  • 有没有什么特别的原因,为什么typename没有模板模板声明允许吗?
  • C++标准是否说明了这一点?

c++ templates typename language-lawyer c++11

28
推荐指数
2
解决办法
2497
查看次数

模板模板参数,为什么类是强制的?

如果我写的话,标题几乎说明了一切;

                                        vvvvv
template <template <typename, typename> class StdContainer, typename T>
class DerivedContainer: public StdContainer<T, std::allocator<T>>
{ /*...*/ };
Run Code Online (Sandbox Code Playgroud)

为什么需要 class 关键字?那是当 typename 被允许时,作为所有其他模板上下文中的替代品。消歧?标准的哪一部分也说明了这一点?

笔记; 我不是从标准容器派生的,这只是一个例子。

c++ templates

3
推荐指数
1
解决办法
248
查看次数

标签 统计

c++ ×2

templates ×2

c++11 ×1

language-lawyer ×1

typename ×1