Поиск имен не работает с вложенными классами - PullRequest
0 голосов
/ 07 июня 2019

Я не знаю, почему это не работает.

template <typename E>
class SearchTree {
public:
    class Iterator {
             Iterator& operator++();
    };
};

template <typename E>
Iterator& SearchTree<E>::Iterator::operator++() {}

предупреждение C4346: Зависимое имя 'iterator' не является типом

ошибка C2061: ошибка синтаксиса: идентификатор 'итератор'

Ответы [ 3 ]

3 голосов
/ 07 июня 2019

Вы можете использовать конечный тип возврата, чтобы исправить это:

template <typename E>
auto SearchTree<E>::Iterator::operator++() -> Iterator& {}

В конечном типе возврата типы могут находиться в области видимости класса.До поиска имени SearchTree<E>:: не видят внутри класса.

2 голосов
/ 07 июня 2019

Это вопрос о области.

С

template <typename E>
Iterator& SearchTree<E>::Iterator::operator++() {}

, когда вы используете символ Iterator для возвращаемого типа, этот тип не известен в этой области.Вы должны указать его область действия:

template <typename E>
typename SearchTree<E>::Iterator& SearchTree<E>::Iterator::operator++() {}

Как уже упоминалось в комментариях и других ответах, вы также можете использовать трейлинг-тип возврата .Это возможно, потому что тогда область действия известна.


В связанной заметке и о том, почему я добавил ключевое слово typename для возвращаемого типа, см. Где и почему я должен поставитьключевые слова template и typename?

0 голосов
/ 07 июня 2019

Вы хотите полностью указать возвращаемое значение:

template <typename E>
SearchTree<E>::Iterator& SearchTree<E>::Iterator::operator++() {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...