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

时间:2014-11-15 03:54:10

标签: c++ templates

假设我有一个课程模板:

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

length的定义是

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

但为什么不呢? (I)

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

或者也许:(II)

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

我猜(II)将是一个功能模板。但实际上我无法理解这种语法背后的逻辑。任何理解模板语法的规则?

3 个答案:

答案 0 :(得分:2)

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
  • 不同

答案 1 :(得分:1)

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

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

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

现在您需要能够明确指定哪个组件采用哪个模板参数。如果没有明确指定<T><U>,您至少会对哪个参数适用于哪个模板产生一些疑惑。在最坏的情况下,这将是模棱两可和无法编译的。

答案 2 :(得分:0)

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

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

int Array<T>::length() const

必须声明C ++中的每个名称。 T,如果要用作模板参数,也必须声明为一个。你没有,因此编译器会查找更早的声明并发出错误消息,因为他找不到。