为什么c ++模板参数应该声明为类类型?

时间:2012-04-22 13:56:43

标签: c++ templates syntax language-lawyer

功能模板的语法

template <**class** T, ...>
    returntype functionname(arguments)
    {
           .....
           .....
     }

我有两个问题?

  1. 为什么模板参数应该声明为类类型?(即 使用class关键字)
  2. 当我们将它声明为类类型时,那么编译器是什么东西 会吗?

5 个答案:

答案 0 :(得分:11)

这是class template参数中使用class引起的常见混淆。

class事与课无关;它只是说模板接受一个类型模板参数(而不是整数 1 模板参数),它可以是任何类型,而不仅仅是类。

那么,他们为什么选择class?因为他们必须使用一个肯定不会在任何C ++程序中使用的关键字,或多或少“听起来不错” - 而且class还可以,因为它已经是C ++中的保留关键字了。

请注意,typename还有typename关键字的替代方案。它们完全等同于 2 ,但我认为typename更加明确,因为这个名称只是说“后面是一个类型参数”,而不会让你认为它必须是类。

为什么允许两种语法?因为template关键字已经在语言中引入(当他们注意到有必要添加另一个关键字来消除模板内部的一些声明时);然后,对class参数声明也进行了“改装”。保留{{1}}关键字的这种用法是为了与同时编写的程序/文档兼容。


  1. 这里为了简单起见我说“积分”,显然我的意思是非类型模板参数(C ++ 11,§14.1¶4)。
  2.   

    template-parameter中的class和typename之间没有语义差异。

    (C ++ 11,§14.1¶2)

答案 1 :(得分:2)

因为这就是语言定义告诉你使用的词。在此上下文中,“T类”意味着“T是某种类型的名称”,而不是“T是某类”的名称。

我认为理由在于不想添加另一个保留词。

然而,这种语言最终还添加了另一个保留字:你可以等同地说'typename T'。

答案 2 :(得分:1)

根据标准,有两个关键字:classtypename。您可以在模板定义中使用其中任何一个。两者具有相同的含义:当您在模板定义中编写class(或typename)时,这意味着模板的用户必须将类型作为模板参数传递给模板;它并不意味着什么。如果它是一个函数模板,那么模板参数可以从函数的参数中推导出(在某些情况下)。

答案 3 :(得分:1)

请注意,您可以将标准类型传递给template,而不仅仅是类:

template <class T, int N> class mysequence {..};

因此,class关键字告诉编译器将T视为类。 N被视为整数。

答案 4 :(得分:0)

  

(1)为什么模板参数应该声明为类类型?

完全不正确。您也可以使用typename。 :)
更重要的是,您也可以将某些类型的const对象声明为参数。 e.g。

template<int I>  // <---- 'I' is not a class/typename
class A { ... };
...
A<3> obj;
  

(2)当我们将它声明为类类型时,那么编译器是什么东西   会吗?

实际上不多 但是,当您调用其对象时,编译器会检查该类型实际上是一个类型名称。 e.g。

template<class T>
class A { ... };  // ok ... not much to check
...
A<int> obj1; // compiler checks if 'int' is a type ---> yes
A<3> obj2; // compiler checks if '3' is a type ---> no