2016-08-04 49 views
4

我有类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?这是否符合标准?如果在Array类别之外还有另一个const_iterator类别,该怎么办?

+1

与您似乎暗示的不同,这与模板无关,同样的规则适用于非模板类。 – Holt

回答

4

是的,这是完全正常和标准(当然,在类中,你需要让你的insert()成员函数采取类型的参数之前声明const_iterator第一)。

对于类之外的成员函数定义,首先在该类的范围内查找类名称范围introducer之后的每个名称。因此,如果有另一个const_iteratorArray,我们仍然会先找到内一个因为那是我们开始寻找的范围请注意,这只是那些名字后级引入具有此特殊查询:

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

将编辑的问题修改为正确的问题。谢谢! :) –