C++ C++;将对象*视为int*

C++ C++;将对象*视为int*,c++,pointers,type-conversion,C++,Pointers,Type Conversion,我有一些接受指向对象的指针的代码,到目前为止,它工作得很好,但是,经过一些清理(我编写了凌乱的代码,然后在大多数错误消失后清理),一个接受指针的函数现在将传递给它的指针视为int*。我已经检查过我确实在传递一个指针,但似乎无法找出这个指针。有人知道为什么会这样吗?下面是一些代码(高度精简,不确定是否允许我显示少量代码,但我需要弄清楚这一点,如果没有太多意义,那么很抱歉)。我已经删除了代码中的敏感部分,坦率地说,我觉得发布这些部分会有麻烦。但代码中的错误部分也包括在内 template <c

我有一些接受指向对象的指针的代码,到目前为止,它工作得很好,但是,经过一些清理(我编写了凌乱的代码,然后在大多数错误消失后清理),一个接受指针的函数现在将传递给它的指针视为
int*
。我已经检查过我确实在传递一个指针,但似乎无法找出这个指针。有人知道为什么会这样吗?下面是一些代码(高度精简,不确定是否允许我显示少量代码,但我需要弄清楚这一点,如果没有太多意义,那么很抱歉)。我已经删除了代码中的敏感部分,坦率地说,我觉得发布这些部分会有麻烦。但代码中的错误部分也包括在内

template <class T>
class TreeStructure {
    class TreeNode {
    public:
        T data;
        TreeNode<T> * parent;
        TreeNode<T> * left;
        TreeNode<T> * right;
        inline TreeNode(T d) : data(d), parent(0x0), left(0x0), right(0x0) {}
        inline TreeNode(T d,TreeNode<T>* p) : data(d), parent(p), left(0x0), right(0x0) {}
        inline TreeNode(T d,TreeNode<T>* p,TreeNode<T>* l,TreeNode<T>* r) : data(d), parent(p), left(l), right(r) {}
    };
    TreeNode<T>* root;
    //Recursive CRUD operations, used as helpers to public CRUD operations, _delete shown
    inline void _delete(TreeNode<T>* c) {
        if(c != 0x0) {
            _delete(c->left);  //this is where things go wrong, _delete compains of no valid conversion from 'int*' to 'TreeStructure::TreeNode<T>* [with T = int]'
            _delete(c->right);
            delete c;
            _size--;
            //irrelavant operations down here
        }
    }
public: 
    inline bool remove(T d) {
        //check if 'd' is in tree, return false if not, get pointer to containing node if so
        TreeNode<T>* node; // this is where we get the reference to the node. code returns if data isn't found, so if we're here, we know we have a node
        //_delete is never called if 'd' isn't in the tree, so we can assume its set to a node since we got this far
        _delete(node); // This call is fine, but the recursive calls in _delete fail

    }

};
模板
类树结构{
三烯类{
公众:
T数据;
TreeNode*父代;
TreeNode*左;
TreeNode*对;
内联树节点(td):数据(d)、父节点(0x0)、左节点(0x0)、右节点(0x0){
内联树节点(td,TreeNode*p):数据(d),父节点(p),左节点(0x0),右节点(0x0){
内联TreeNode(td,TreeNode*p,TreeNode*l,TreeNode*r):数据(d),父(p),左(l),右(r){}
};
树根;
//递归CRUD操作,用作公共CRUD操作的助手,如图所示
内联void_delete(TreeNode*c){
如果(c!=0x0){
_delete(c->left);//这就是问题所在,_删除从'int*'到'TreeStructure::TreeNode*[with T=int]没有有效转换的compains'
_删除(c->右);
删除c;
_大小--;
//这下面是不相干的行动
}
}
公众:
内联布尔删除(T d){
//检查“d”是否在树中,如果不在,则返回false,如果在树中,则获取包含节点的指针
TreeNode*node;//这是我们获取节点引用的地方。如果找不到数据,代码将返回,因此如果我们在这里,我们就知道我们有一个节点
//_如果“d”不在树中,则永远不会调用delete,因此我们可以假设它的集是一个节点,因为我们已经完成了这一步
_delete(node);//此调用正常,但_delete中的递归调用失败
}
};

当我调用
remove()
时,
remove()
依次调用
\u delete()
,当节点是
TreeNode*
时,它会抱怨节点是
int*
。我知道传递给
\u delete()
的任何内容都是
树节点*
,即使递归调用,也会防止NULL(如果NULL,则为noop)。所以我的问题是:为什么会发生这种情况,我该如何解决这个问题?谢谢大家

编译器不理解什么是
TreeNode
,因为它没有命名类型<代码>树节点不是模板。使用
TreeNode
,无论你在哪里
TreeNode

TreeNode
隐式地从其外部模板类中获取
T
,因此以这种方式指定它甚至没有必要。换句话说,
treeststructure::TreeNode
treeststructure::TreeNode
已经是不同的类型了

我不确定你为什么会得到你得到的具体错误,但我会假设编译器吐出的错误乱七八糟的地方是抱怨
TreeNode
不是一个模板,因此
后缀没有意义。C和C++编译器在遇到错误并试图使事情正常工作的同时,也一直在努力向前发展,这是一个长期的传统。我认为理论是,它一次引发的错误越多,需要进行的编译器调用就越少,因为每次运行时可以修复多个错误。然而,在实践中,这意味着编译器正在做出错误的假设,然后根据这些假设产生错误,因此它也会产生大量噪音


在C和C++编程中,总是要注意第一个错误。之后的一切可能都是无用的噪音。

编译器不理解
TreeNode
是什么,因为它没有命名类型<代码>树节点不是模板。使用
TreeNode
,无论你在哪里
TreeNode

TreeNode
隐式地从其外部模板类中获取
T
,因此以这种方式指定它甚至没有必要。换句话说,
treeststructure::TreeNode
treeststructure::TreeNode
已经是不同的类型了

我不确定你为什么会得到你得到的具体错误,但我会假设编译器吐出的错误乱七八糟的地方是抱怨
TreeNode
不是一个模板,因此
后缀没有意义。C和C++编译器在遇到错误并试图使事情正常工作的同时,也一直在努力向前发展,这是一个长期的传统。我认为理论是,它一次引发的错误越多,需要进行的编译器调用就越少,因为每次运行时可以修复多个错误。然而,在实践中,这意味着编译器正在做出错误的假设,然后根据这些假设产生错误,因此它也会产生大量噪音


在C和C++编程中,总是要注意第一个错误。之后的一切可能都是无用的噪音。

TreeNode
不是一种类型,
TreeNode
<代码>树节点不是模板。只需使用
TreeNode
。(
TreeStructure::TreeNode
是一种类型,但它不是模板。它是一种声明为模板类型的子类型的非模板类型。)此外,如果使用
std::unique_ptr
而不是原始指针,那么所有手动删除的麻烦都会消失。
TreeNode
不是
int
。指向
TreeNode
的指针不是指向
int
的指针。你不能把两者互换。为什么会令人惊讶呢?如果你创建了一个最小的完整示例,那么回答起来就容易多了