模板类

时间:2016-08-04 12:17:44

标签: c++ templates c++14

我有一个定义内部类Array

的类const_iterator
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?这个标准是否合规?如果在课程const_iterator之外还有另一个Array课程怎么办?

1 个答案:

答案 0 :(得分:4)

是的,它非常精细且标准(在类中,您需要在const_iterator成员函数采用该类型的参数之前先声明insert()

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

// 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
{ ... }