C++ 为什么带有指针参数的成员函数需要指向指针的指针?

C++ 为什么带有指针参数的成员函数需要指向指针的指针?,c++,templates,C++,Templates,我有一个通用类: template<typename T> class QuadTree { 我原以为这会起作用,但除非我传递&obj,一个指向指针的指针,否则我会得到一个错误。当我在Visual Studio中将T设置为Circle时,Intellisense将方法签名显示为bool QuadTree::insert(Circle**obj),但为什么会这样呢 编辑:以下是该类的精简版本: template<typename T> class QuadTree {

我有一个通用类:

template<typename T>
class QuadTree {
我原以为这会起作用,但除非我传递&obj,一个指向指针的指针,否则我会得到一个错误。当我在Visual Studio中将
T
设置为
Circle
时,Intellisense将方法签名显示为
bool QuadTree::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
    }
};
模板
类四叉树{
const int QT_NODE_容量=4;
std::向量元素;
四叉树*nw;
四叉树*ne;
四叉树*sw;
四叉树*se;
公众:
四叉树():西北(nullptr)、东北(nullptr)、西南(nullptr)、东南(nullptr){
元素=std::vector();
}
bool镶块(T*obj){
//如果(!boundary.containsObject(obj)){
//return false;//对象不属于此处
//}
if(elements.size()insert(&obj))返回true;
如果(ne->insert(&obj))返回true;
if(sw->insert(&obj))返回true;
if(se->insert(&obj))返回true;
return false;//不应到达
}
};

在类模板中

template<typename T>
class QuadTree {}
模板
类四叉树{}
。。。如果T是实例化过程中的指针(它是)

四叉树*nw//注意,不是
。。。这意味着当实例化时,
bool-insert(T*obj)
,变成bool
insert((T*)*obj)
(因为T已经是类型指针-括号用于强调)。因此,插入时不必记录对象的地址(在许多其他错误中)。当您获取对象的地址时,实际上是获取临时地址(指向指针的变量)-这是您的错误


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

请发布一段不完整的代码。您的描述有点难以理解。请发布一个。为什么
四叉树*nw
?为什么不
四叉树*nw?不过,这可能需要更多的代码来回答。(a怎么样?)一个
四叉树
四叉树
类型的节点听起来很奇怪,可能是你问题的根源
,对于具有类型为
T
的元素的根,第一级子元素将具有类型为
T*
、第二级元素类型为
T**
的元素,依此类推。不知怎么的,我觉得不对。。。
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
    }
};
template<typename T>
class QuadTree {}
QuadTree<T*>* nw; //NOTE <T*>, not <T>