我有一个定义内部类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
课程怎么办?
答案 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
{ ... }