Передача итератора в функцию - PullRequest
1 голос
/ 11 августа 2010

Просматривая исходный код двоичного дерева, я нахожу следующую функцию:

//definition of BTR,in case you'd want to know
template< class Type>
struct BTR 
{
    // The item saved to that specifiec position into the tree
    Type  value;    

    // Points to the left leaf
    BTR<Type>*  left;

    // Points to the right leaf
    BTR<Type>*  right;  
};

//why typename?
template< class Type>
BTR<Type>* CreateEx(typename const std::vector<Type>::iterator start,typename const std::vector<Type>::iterator end) 
{
    //definition
}

Теперь, что меня смущает в этой функции, так это ее параметры. Зачем ему ключевое слово typename? Потому что, если я удаляю оба typenames, мой компилятор начинает жаловаться и говорит, что я должен поставить «)» перед идентификатором «start». И если я изменил параметры так, чтобы функция взяла два вектора вместо двух итераторов и удалила имена типов, мой компилятор перестанет жаловаться (хотя, конечно, функция больше не работает).

// perfectly acceptable!
template< class Type>
BTR<Type>* CreateEx( const std::vector<Type> start, const std::vector<Type> end)

Так что, похоже, мне нужно ключевое слово, потому что функции нужны два итератора. Но почему это ключевое слово необходимо в такой ситуации?

1 Ответ

5 голосов
/ 11 августа 2010

Поскольку компилятор не знает, является ли std :: vector :: iterator типом или членом std :: vector , и поэтому ему требуется небольшая помощь в форма typename .

...