1

Не могу понять синтаксис возврата итератора класса с помощью метода класса. Вот небольшой пример:

template<typename T>
class Test{
public:
    class Iterator{
        Iterator();
    };
    Iterator Find();
};

template<typename T> Test::Iterator Test<T>::Find() { return Test::Iterator(); }

На такую запись компилятор ругается на вынесенную реализацию метода.

'Test' is not a class, namespace, or enumeration

Как нормально вынести реализацию метода в этом случае? Так же интересует как вынести объявление класса Iterator из класса, который его содержит. Т.е в классе написать только class Iterator; а остальное объявление написать вне класса.

αλεχολυτ
  • 28,987
  • 13
  • 60
  • 119
Denver Toha
  • 2,595
  • 1
    Там typename Test<T>::Iterator должно быть. – user7860670 Mar 26 '21 at 10:38
  • А зачем вам выносить реализацию метода из шаблонного класса? Какой в этом смысл? – Andrej Levkovitch Mar 26 '21 at 11:37
  • @AndrejLevkovitch смысл тот же, что и для нешаблонного класса. Не смешивать определение класса и определение его функций. – αλεχολυτ Mar 26 '21 at 12:07
  • @αλεχολυτ я вас не понимаю: про определение класса я вообще ничего не говорил, лишь про реализацию методов. Что касается "того же смысла что и для нешаблоннго класса", то вам следует вспомнить, что реализацию шаблонных функций и методов вы не можете засунуть в cpp файл - она должна находится в заголовочном файле – Andrej Levkovitch Mar 26 '21 at 16:14
  • @AndrejLevkovitch Шаблон можно в cpp, если используется только в cpp, или известны типы, которые нужны. См. ревизию 12 тут. Реализацию функций разумно выносить из класса, чтобы проще воспринять сам класс, а не листать весь файл. Как я уже говорил, это имеет смысл для любых классов, и шаблонных в том числе. – αλεχολυτ Mar 26 '21 at 18:42
  • @αλεχολυτ если используется только в cpp, то тогда хидер зачем? Что же касается восприятия - да, это может помочь восприятию, если вы не имеете тэгбара (что есть даже для простейших редакторов), но реальная причина вынесения реализации в cpp файлы совершенно другая: ускорение компиляции. – Andrej Levkovitch Mar 26 '21 at 18:52
  • @AndrejLevkovitch так это ваши слова, что реализация должна быть в хидере. Не всегда и везде есть удобная IDE под рукой для просмотра кода. Достаточно вспомнить этап ревью в браузере. Про ускорение компиляции не понял. В каком случае? Имеется в виду для шаблонов, конечно. – αλεχολυτ Mar 26 '21 at 19:00
  • @αλεχολυτ я не говорил, что реализация должна быть в хидере - я говорил что ДЛЯ ШАБЛОНОВ реализация должна быть в хидере - это разные вещи. Что касается ускорения компиляции - да, это объективный факт, вы не вкурсе про это? И я не понял про последнее предложение про шаблоны - это к чему относится? – Andrej Levkovitch Mar 26 '21 at 20:05

1 Answers1

4

Вот так можно:

template<typename T>
class Test{
public:
    class Iterator;
    Iterator Find();
};

template<typename T> class Test<T>::Iterator{ public: Iterator(); };

template<typename T> typename Test<T>::Iterator Test<T>::Find(){ return Iterator(); }

n1tr0xs
  • 11,944