2014-11-15 27 views
2

比方说,我有一个类模板:了解C++模板方法定义语法

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)将是一个函数模板。但实际上我无法理解这个语法背后的逻辑。任何规则来理解模板语法?

回答

1

为什么就不能(I)很简单:没有template线,编译器将别无选择,只能解释<为小于运算符,这将肯定不会导致一个有用的功能定义。

对于(II)我们需要考虑如何表示类模板的函数模板。说你的班级是这样的:

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

现在你需要能够明确指定哪个组件需要哪个模板参数。在没有明确指定<T><U>的情况下,您至少会有一些混淆关于哪个参数适用于哪个模板。在最坏的情况下,它会模糊不清。

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

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

int Array<T>::length() const 

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

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