【发布时间】:2020-04-08 15:48:48
【问题描述】:
我在模板类中使用 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>* 类型。
在我看来,编译器似乎拥有金鱼的记忆力,即使仍在同一个类定义中,也会忘记类型是什么。很可能不是这种情况,我怀疑是我做错了什么导致了这种情况。
关于我哪里出错或如何解决问题的任何想法?
【问题讨论】:
-
当您“鼠标悬停”某些东西时,您似乎非常信任 IDE 向您显示的内容。不。充其量将其视为“有用的提示/猜测”。
-
如果这是您的代码的确切顺序,那么当您声明
template<typename T> class enable_movable_ptr时,movable_ptr尚不为人所知。编译器的内存很好,但它是从上到下读取的。 ;-) -
是的,现在我看得很清楚了。在处理细节时忘记基础可能会导致问题,谁会猜到:D