Синтаксис типа возвращаемого значения функции в заголовочном файле для возвращаемого типа вложенного шаблона класса в C ++ - PullRequest
0 голосов
/ 19 января 2019

Я работаю над созданием своего собственного векторного класса, похожего на вектор, который вы найдете в C ++ STL.В моем заголовочном файле есть два класса, мой векторный класс и мой класс итератора, который является вложенным классом шаблона.Мне интересно, какой правильный синтаксис для возвращаемого типа для вложенного класса итератора.В этом случае с моим кодом я ищу правильный способ написать правильный синтаксис возвращаемого типа для моей функции begin() и моей функции end(), оба из которых находятся в моем векторном классе.Предполагается, что оба типа begin() и end() имеют тип возврата vector <T> :: iterator, но это, похоже, не работает.Вот как мой код в настоящее время настроен.

template <class T>
iterator;

/************************************************
 * VECTOR
 * A class that holds stuff
 ***********************************************/
template <class T>
class vector
{
public:
   // code removed for brevity

   // Methods of the Vector class
   vector <T> :: iterator begin();
   vector <T> :: iterator end();


private:
   // Code removed for brevity
};

/**************************************************
* VECTOR ITERATOR
* An iterator through array
*************************************************/
template <class T>
class vector <T> :: iterator
{
    // ...code removed for brevity
};

Кроме того, у меня есть правильный код для следующих двух строк, которые находятся вверху моего файла .h?

template <class T>
iterator;

Или это будет так?

template <class T>
vector <T> :: iterator;

Спасибо!

1 Ответ

0 голосов
/ 19 января 2019

Вы можете просто переместить определение iterator в vector:

template <class T>
class vector {
public:
    class iterator {
        /* How you implement a iterator of type T */
    };

    iterator begin(); // for example

    // other fantastic stuff
};

template <class T>
vector<T>::iterator vector<T>::begin()
{
    // whatever
}

Если вы не хотите определять iterator внутри, это может сделать:

template <class T>
class vector {
public:
    class iterator; // only a declaration

    iterator begin(); // same

    // other fantastic stuff
};

template <class T>
class vector<T>::iterator {
    // the actual definition goes here
};

template <class T>
vector<T>::iterator vector<T>::begin()
{
    // same
}

Кроме того, вы также можете определить iterator отдельно и сделайте vector::iterator псевдонимом:

template <class T>
class iterator { /* real definition */ };

template <class T>
class vector {
public:
    using iterator = ::iterator<T>;
    // or typedef ::iterator<T> iterator;

    iterator begin(); // still the same

    // same fantastic stuff
};

template <class T>
vector<T>::iterator vector<T>::begin()
{
    // all the same
}

Надеюсь, это поможет.

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