我目前有以下循环双重链接列表作为父级(由班级教授提供):

template <class datatype>
class CDLL
{
public:
    struct node;
    class iterator;

    // Constructors
    CDLL(void);
    CDLL(unsigned int n_elements, datatype datum);
    CDLL(const CDLL& rlist);
    CDLL(iterator begin, iterator end);

    // .. code ...

};


我们的指令是创建一个从此CDLL继承的队列:

template <class datatype>
class Queue : protected CDLL<datatype> {
public:
    using CDLL<datatype>::CDLL;

    // ... code ...
};


在我的测试中,我有:

Queue<int> x = Queue<int>(2, 1); // Creates a queue of: [1, 1]
Queue<int> * y = &Queue<int>(2, 1); // Creates a queue of: []


我已经对其进行了彻底的调试,它遍历了构造函数步骤(将每个元素推入队列/ cdll),并且遍历了每一步。当它从cdll构造函数弹出时,它“忘记”了它所做的一切。 this构造函数中cdll的地址与y的地址匹配。我也尝试过Queue<datatype>::Queue() : Queue::CDLL<datatype>() {},但是相同的行为仍然存在。

我看了看:

C++ Inheritance constructor overrideWhat are the rules for calling the superclass constructor?和其他一些标题与此相似的问题,但我似乎无法解释其行为。

我浏览过google / SO,并尝试了许多建议的许多解决方案,但无济于事。

最佳答案

这个:

Queue<int> * y = &Queue<int>(2, 1);


无效的C ++。它显然已被MSVC扩展接受。问题是,尽管此扩展名允许您使用临时地址,但不会延长其寿命。这意味着Queue<int>的实例一旦完成y的初始化便被销毁,从而使y悬空并且无法通过调试器进行进一步检查。

要禁用MSVC扩展,请use the /Za compiler switch

10-08 08:54