Reputation: 65
I have class Array
that defines inner class 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
}
Is it normal, that outside of the class I have defined the function and have used const_iterator position
as the first argument type instead of writing typename Array<T, SIZE>::const_iterator position
? Is this standard compliant? What if there is another const_iterator
class outside of class Array
?
Upvotes: 4
Views: 268
Reputation: 303307
Yes, it's perfectly fine and standard (well, within the class you need to declare const_iterator
first before having your insert()
member function take a parameter of that type).
For member function definitions outside of the class, every name that comes after the class name scope introducer is looked up within the scope of that class first. So if there were another const_iterator
outside of Array
, we would still find the inner one first since that's the scope we start looking in. Note that it's only those names after the class introducer that have this special lookup:
// 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
{ ... }
Upvotes: 4