Функция возврата вместо предполагаемого необработанного указателя на шаблонный класс в C ++ - PullRequest
0 голосов
/ 08 апреля 2020

У меня проблемы с использованием переменной first_ в моем шаблонном классе (показано ниже).

template<typename T> class enable_movable_ptr {
public:
    //default constructor
    enable_movable_ptr() : ptr_(nullptr) {};
    enable_movable_ptr(T* p) : ptr_(p) {};

    //...
    //other constructors and operators
    //...

    T* get() {return ptr_; };
    movable_ptr<T>* First() { return first_; };
private:
    T* ptr_;
    movable_ptr<T>* first_ = nullptr;
};

template<typename T> class movable_ptr {
public:
    //Parameterless constructor
    movable_ptr() : trg_(nullptr) {};

    //Constructor from T*
    movable_ptr(T* p) : trg_(p) { add_to_tracked(this); };

    //...
    //other constructors and operators
    //...

    //access to variables
    enable_movable_ptr<T>* get() {return trg_; };
    movable_ptr<T>* Next(enable_movable_ptr<T>& p) {return next_; };
    movable_ptr<T>* Previous(enable_movable_ptr<T>& p) {return prev_; };

    //get_movable
    movable_ptr<T>* get_movable(enable_movable_ptr<T>& p) {};
private:
    enable_movable_ptr<T>* trg_;
    movable_ptr<T>* next_ = nullptr;
    movable_ptr<T>* prev_ = nullptr;
};

template<typename T> movable_ptr<T> get_movable(enable_movable_ptr<T>& p){
    if (p.First() != nullptr)
    {}
};

Проблема в том, что возвращаемое first_ имеет тип <error-type> (вот что он показывает, если я наведу курсор мыши на любой first_ или First() в коде, за исключением объявления в VS2019), вместо ожидаемого movable_ptr<T>*. Однако, если я наведу курсор мыши на объявление first_, оно покажет правильный тип movable_ptr<T>*.

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

Есть идеи, где я ошибся или как решить проблему?

1 Ответ

1 голос
/ 08 апреля 2020

Просто передайте декларацию movable_ptr перед определением enable_movable_ptr.

template<typename T> class movable_ptr;

В противном случае компилятор не знает, что movable_ptr - это даже вещь, которая может существовать.

Кроме того, лучше не полагаться на внешние инструменты, такие как IDE, чтобы сообщить вам, что не так с кодом. Пусть компилятор сделает это; скорее всего, он знает гораздо больше о вашем коде.

Вот откуда на самом деле возникает проблема (я удалил весь код, который не имеет отношения к вашей конкретной проблеме)

// you need to forward declare
template <typename T> struct movable_ptr;

template <typename T> struct enable_movable_ptr {
  movable_ptr<T>* first_ = nullptr;  // else compiler won't know what movable_ptr is
};

template <typename T> struct movable_ptr {  
  enable_movable_ptr<T>* trg_;
};

Вот ссылка на mcve .

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