Да, это называется поиском зависимого имени.
Если C
является шаблоном, то в конструкции C<T>::N
N
может быть именем типа или stati c член класса. Компилятор не может знать, что именно, не зная типа T
. Это потому, что C
может быть специализированным, так что N
имеет разные значения в зависимости от типа T
.
Когда компилятор впервые видит template <typename K, typename V>
typename BST<K,V>::Node* bst<K,V>::root()
, он не знает, какие типы K
и V
, поэтому нужно сказать, что Node
является типом для анализа кода. Вот что делает третий typename
.