模板类外部的内部类方法定义

inner class method definition outside of a template class

本文关键字:内部 类方法 定义 外部      更新时间:2023-10-16

我有定义内部类const_iterator 的类Array

template <class T, int SIZE = 100>
class Array
{
    // my class here
public:
    class const_iterator
    {
     // my class here
    };

    void insert(const_iterator position, int value);
};

template <class T, int SIZE /*= 100*/>
void Array<T, SIZE>::insert(const_iterator position, int value)
{
    // impl
}

在类之外,我定义了函数,并使用const_iterator position作为第一个参数类型,而不是编写typename Array<T, SIZE>::const_iterator position,这正常吗?这个标准符合吗?如果Array类之外还有另一个const_iterator类,该怎么办?

是的,它非常好且标准(在类中,在insert()成员函数接受该类型的参数之前,您需要首先声明const_iterator)。

对于类之外的成员函数定义,首先在该类的范围内查找类名作用域导入器之后的每个名称。因此,如果在Array之外还有另一个const_iterator,我们仍然会首先找到内部的,因为这是我们开始查找的范围。请注意,只有类介绍人之后的那些名称才有这种特殊的查找:

// this is okay
template <class T, int SIZE>
typename Array<T, SIZE>::const_iterator Array<T, SIZE>::some_method() { ... }
// error: this does *not* find the nested const_iterator class
template <class T, int SIZE>
const_iterator Array<T, SIZE>::some_method() { ... }
// this is okay. trailing return type comes after the class introducer
template <class T, int SIZE>
auto Array<T, SIZE>::some_method() 
    -> const_iterator
{ ... }