了解C++模板方法定义语法
Understanding C++ template method definition syntax
假设我有一个类模板:
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
,如果要用作模板参数,也必须声明为模板参数。您没有,因此编译器将查找较早的声明,并在找不到时发出错误消息。
相关文章:
- 单独定义模板化嵌套类方法的正确语法
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- C++使用 rand 定义函数语法
- 在标准中,模板参数的语法在哪里定义,例如,'std::function<int(char)>'?
- 创建具有验证和语法突出显示的自定义 printf
- C++类定义语法
- C++定义/赋值语法
- 标准库中的任何正则表达式语法是否支持 (?(定义)用于子模式参考?
- 带有自定义类的共享指针语法背后的任何原因,如下所示
- 在语法树中的节点上定义的层次结构的表达式模板
- OpenCV - Ptr 语法和类定义/声明 - 混淆?
- 为什么C++没有简洁的语法允许在不定义计数器的情况下多次执行操作?
- 通过该类中定义的指针调用类方法时的语法
- 如何在源文件中定义类并将其声明在标题文件中(而不必使用`class :: method'语法定义类方法)
- 是C 中的语法错误,以结束与A}的类定义中的函数
- Linux正确的语法将通过config传递libstdc 的自定义目录
- 将变量定义为数组和正确的语法
- 使用自定义对象的地图使用MAP?可能是语法问题
- 你能解释一下这个C++函数定义的语法吗?
- 语法意外失败提升::精神语法定义