Просматривая исходный код двоичного дерева, я нахожу следующую функцию:
//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)
Так что, похоже, мне нужно ключевое слово, потому что функции нужны два итератора.
Но почему это ключевое слово необходимо в такой ситуации?