Шаблон класса с <T>или без (C ++) - PullRequest
6 голосов
/ 28 января 2020

Согласно Почему в типе, возвращаемом функцией, не допускается удержание аргумента?

При указании типа возвращаемого значения в функции-члене класса шаблона необходимо указать c, для пример: «тип std::vector не является типом, std::vector<int> - это.»

Так почему оба этих примера компилируются? Если я не включу <T> в первый пример, его даже не следует рассматривать как правильный тип?

template<typename T>
Queue<T>::Queue(const Queue& st) {}

template<typename T>
Queue<T>::Queue(const Queue<T>& st) {}

Учитывая этот класс шаблона

template<typename T>
class Queue {
   private:

    struct Node {
        Node (T value) : value(value), next(nullptr) {}
        Node (T value, Node* next) : value(value), next(next) {}
        T value;
        Node* next;
    };

    Node* head;
    size_t sz;
    void cleanList();

  public:
    Queue();

    Queue(const Queue& st);
    Queue& operator=(const Queue& st);

    ~Queue();

    size_t size() const noexcept;
    bool isEmpty() const noexcept;

    T& front();
    const Tt& front() const;

    void enqueue(const T& elem);

    void dequeue();
};

1 Ответ

8 голосов
/ 28 января 2020

Причина, по которой эти примеры работают, заключается в том, что введенное имя класса . Если у вас есть

template<typename T>
some_type<T> some_type<T>::some_func(some_type)

, тип возвращаемого значения не входит в область действия класса, поэтому вам необходимо указать параметр шаблона. В параметре функции вы находитесь в области видимости класса и в области видимости класса some_type вводится как имя для some_type<T>, поэтому вам не нужно использовать some_type<T>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...