2013-08-08 8 views
0

Этот бит кода, если из примера для связанного списка, но я изо всех сил пытаюсь понять вторую строку этой функции, может кто-нибудь поговорить с ней через нее?C++ typename в определении функции

template <typename T> 
typename List<T>::Node* List<T>::search(T d) 
{ 
    if(!head) return NULL; 
    Node* cur = head; 
    while(cur) { 
     if(cur->data == d) return cur; 
     cur = cur->next; 
    } 
    return NULL; 
}  
+0

Это использование двух скобок e, которые я не понимаю –

+0

Вот откуда взялся пример: http://www.bogotobogo.com/cplusplus/linkedlist.php#linkedlistexample10 –

+0

@JamesGillard один для типа возврата и один для имени функции ... –

ответ

1

Там будет *type* Node где-то в List<> шаблона класса (или специализации), поэтому при обращении к этому типу синтаксис typename List<T>::Node должен быть использован.

Dependant names может быть неоднозначно с использованием ключевого слова typename.

+0

Почему typedef? Может быть перечисление, структура или класс. Даже шаблонный псевдоним. Итак, вы имели в виду: в «List <>' _specialization/instantiation_ будет указано вложенное typename. – sehe

+0

Вы правы. У меня была эта проблема с typedefs в последнее время, поэтому я был немного ослеплен, спасибо. – DrYap

+1

Я добавил «или специализацию», поскольку это действительно то, почему компилятор действительно не может знать все типы имен при первом проходе (помимо CRTP, кстати). +1 для упоминания соответствующего термина «Зависимое имя», хотя – sehe

0

Рассмотрите A<T>::X. X может быть типом (typedef, struct и т. Д.), Или он может быть переменным (статическая переменная). Когда вы находитесь внутри шаблона и используете тип, который имеет шаблон таким образом, вы должны помочь компилятору, добавив typename, если ваш X является типом.

0

Если вы имеете в виду вторую строчку в ваш пост, который говорит: «Поиск является функция, которая принимает аргумент типа T и возвращает указатель на тип конкретного к Linked List под названием List<T>::Node.

Если вы означает вторую строку в самой функции search, она просто инициализирует локальный var cur переменной-члену, которая называется head (здесь, вероятно, ссылается на заголовок связанного списка данных st.). Остальная часть кода просто выполняет итерацию наших элементов списка, пока не будет найден и возвращен узел, содержащий данные, которые ищут.

+0

Связанные данные списка st.? Я не знал, что связанные списки имели своего святого покровителя в эти дни. – sehe

Смежные вопросы