假设我有一个课程模板:
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)将是一个功能模板。但实际上我无法理解这种语法背后的逻辑。任何理解模板语法的规则?
答案 0 :(得分:2)
int Array<T>::length() const
{
...
}
非法如果:
T
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
,如果要用作模板参数,也必须声明为一个。你没有,因此编译器会查找更早的声明并发出错误消息,因为他找不到。