首页 > 解决方案 > 为什么带有指针参数的成员函数需要指向指针的指针?

问题描述

我有一个通用类:

template<typename T>
class QuadTree {

该类的节点具有成员变量,如下所示

QuadTree<T*>* nw;

我遇到的问题是以下成员函数:

bool insert(T *obj) {
        //...
        if (nw->insert(obj)) return true;
        //...

我认为这会起作用,但除非我传递 &obj,一个指向指针的指针,否则我会得到一个错误。当我设置TCircleVisual Studio 中时,Intellisense 将方法签名显示为bool QuadTree<Circle *>::insert(Circle **obj),但为什么会这样呢?

编辑:这是该类的剥离版本:

template<typename T>
class QuadTree {
    const int QT_NODE_CAPACITY = 4;
    std::vector<T*> elements;
    QuadTree<T*>* nw;
    QuadTree<T*>* ne;
    QuadTree<T*>* sw;
    QuadTree<T*>* se;

public:
    QuadTree<T>() : nw(nullptr), ne(nullptr), sw(nullptr), se(nullptr) {
        elements = std::vector<T*>();
    }


    bool insert(T* obj) {
        //if (!boundary.containsObject(obj)) {
        //    return false; //Object does not belong here
        //}
        if (elements.size() < QT_NODE_CAPACITY && nw == nullptr) {
            elements.push_back(obj);
            return true;
        }
        if (nw == nullptr) {
            //subdivide();
        }
        //Try to insert element in one of the subtrees until it succeeds
        if (nw->insert(&obj)) return true;
        if (ne->insert(&obj)) return true;
        if (sw->insert(&obj)) return true;
        if (se->insert(&obj)) return true;

        return false; //should never be reached
    }
};

标签: c++templates

解决方案


在您的课程模板中...

template<typename T>
class QuadTree {}

...如果 T 是实例化期间的指针(它是)...

QuadTree<T*>* nw; //NOTE <T*>, not <T>

...这意味着bool insert(T* obj),当实例化时,变为 bool insert((T*)* obj)(因为 T 已经是类型指针 -用于强调的括号)。因此,在插入时不需要获取对象的地址(在许多其他错误中)。当您确实获取对象的地址时,您实际上是在获取临时地址(指针变量)-这是您的错误。

一个解决方案可能是将 insert 更改为insert(T& obj),这将允许您获取引用的地址,或者更改为insert(T*& obj),这意味着您已经存储了真实指针的地址(而不是通过值传递的参数的地址...一个具有地址值的变量,其生命周期仅适用于函数)...希望它有意义)。


推荐阅读