了解C++模板方法定义语法

Understanding C++ template method definition syntax

本文关键字:语法 定义 模板方法 C++ 了解      更新时间:2023-10-16

假设我有一个类模板:

template <typename T>
class Array {
  ... 
  int length() const;
};

length的定义是

template <typename T>
int Array<T>::length() const
{
   ...
}

但为什么不会呢?(一)

int Array<T>::length() const
{
   ...
}

或者也许:(二)

template <typename T>
int Array::length() const
{
   ...
}

我想(II)将是一个函数模板。但实际上我无法理解这种语法背后的逻辑。有什么规则可以理解模板语法吗?

int Array<T>::length() const
{
   ...
}

在以下情况下为非法:

  • 您尚未声明名为 T 的类
  • 您尚未使用 Typedef 为现有类型指定新名称 - T

前任:

class T;
typedef double T;
using T = double;

template <typename T>
int Array::length() const
{
   ...
}

在以下情况下为非法:

  • 您没有一个名为 Array 的类 - 与 template <class T> Array 不同

为什么不能(I)很简单:如果没有template行,编译器将别无选择,只能将<解释为小于运算符,这绝对不会产生有用的函数定义。

对于(II),我们需要考虑如何表示类模板的函数模板。假设你的班级看起来像这样:

template <typename T>
class Array {
  ... 
  template <typename U>
  int length() const;
};

现在,您需要能够显式指定哪个组件采用哪个模板参数。如果不明确指定<T><U>您至少会对哪个参数适用于哪个模板产生一堆混淆。在最坏的情况下,它将是模棱两可和不可编译的。

template <typename T>
int Array::length() const

模板可能存在部分专用化。编译器应该如何知道这是主模板成员的定义还是部分专用化?

int Array<T>::length() const

C++中的每个名字都必须声明。 T ,如果要用作模板参数,也必须声明为模板参数。您没有,因此编译器将查找较早的声明,并在找不到时发出错误消息。