C++ C++;泛型节点类不会接受不同类型的节点

C++ C++;泛型节点类不会接受不同类型的节点,c++,templates,generics,tree,nodes,C++,Templates,Generics,Tree,Nodes,我试图创建一个泛型节点类,该类可以存储对其他泛型节点的引用,这些泛型节点的数据可以具有不同的类型 template < class T > class BiTreeNode { T d; BiTreeNode *parent; //Trying to store a node of different type here public: BiTreeNode(void); BiTreeNode(T); void setData(T);

我试图创建一个泛型节点类,该类可以存储对其他泛型节点的引用,这些泛型节点的数据可以具有不同的类型

template < class T >
class BiTreeNode {
    T d;
    BiTreeNode *parent; //Trying to store a node of different type here
public:
    BiTreeNode(void);
    BiTreeNode(T);
    void setData(T);
    T * getData(void);
    void setParent(BiTreeNode * const); // Error here.
    BiTreeNode * getParent(void);
};
模板
类双重节点{
td;
BiTreeNode*parent;//尝试在此处存储不同类型的节点
公众:
双重节点(void);
双重节点(T);
无效设置数据(T);
T*getData(无效);
void setParent(BiTreeNode*const);//此处出错。
BiTreeNode*getParent(无效);
};
具体错误:

错误1错误C2664:'void BiTreeNode::setParent(BiTreeNode*const)':无法将参数1从'BiTreeNode*'转换为'BiTreeNode*const'(文件位置)42 1 p=NP

模板是一个类工厂:它生成类(不是值:类)。生成的类几乎没有连接(您可以对它们进行类型模式匹配)

模板生成类型

这些类型生成值

您不能将指针指向一种类型的值,并将其指向其他类型的值,公共布局/继承规则允许的值除外。这就是你要求做的

现在,您可以在生成的类型之间创建某种类型的关系,但是继承在实践中很少是您想要的,并且公共布局也不能提供您想要的有一个共同的父母有时很有用,会给你一些你想要的。

至于语法错误,模板类本身中没有参数列表的模板类的名称隐式引用具有“相同”模板参数的模板类。因此在
foo
中,
foo
隐含地指
foo

您可能正在尝试复制一种在C++中与泛型一起使用的技术:泛型不是模板。模板可以用来生成泛型,但是这个过程非常复杂,所以最好编写模板代码,而不是泛型代码。重新设计

公共父类意味着您创建了一个
base
类,
模板类
从中生成。使用
base*
引用指向由
模板生成的任何类型的任何值的指针。粘贴由模板生成的每种类型的类的公共属性(如父类
base
指针),以便您可以通过
base*
指针访问它们


如果您希望访问不常见的属性(如
T get_value()
),以上内容对您没有帮助。找出如何解决3类案例的问题(
int
double
和base say),并查看该技术是否适用于n+1类案例。从上面的描述中,我猜不出答案是什么:如果您有这样的属性,请写一个新问题。

不同的模板实例化,即使它们似乎具有相同的名称,也没有关系

模板是为代码重用而设计的,每个不同类型的模板实例化实际上是一个完全不同的类类型,没有多态关系

BiTreeNode
BiTreeNode
是两个没有公共基类的不同类。如果您只是将符号作为类名的一部分来阅读,就很容易记住这一点

要实现您试图实现的目标,只需让模板化类从公共基类派生:

class BaseTreeNode
{
};

template < class T >
class BiTreeNode : public BaseTreeNode
{
 T d;
    BaseTreeNode *parent; 

...

}
类BaseTreeNode
{
};
模板
类BiTreeNode:公共BaseTreeNode
{
td;
BaseTreeNode*父代;
...
}

这样,创建的每个模板类都来自同一个类,并且您具有所需的多态性。

这不起作用,因为如果
T1
T2
不是同一类型,则
BiTree
BiTree
不是同一类型。但是你在问什么呢?
(文件位置)
包含
42
P=NP
?:D@tgmath复活节彩蛋不够?@juanchopanza我试图在
*parent
中存储另一个不同类型的节点,它给出了一个错误:/n您不能。所有双树节点类型都需要一个公共基类。模板实例是什么意思?@Yakk:注意,“模板实例”指定的是生成的类,而不是生成的类的实例。现在要找到一个比“模板实例”更好的措辞…@michaelmitchell该短语现在应该删除。@quentin因为你不能有一个指向类型的指针(heh),在特定的用法中不可能有歧义,但最好使用更清晰的语言。我仍然很迷茫,您能否提供一个链接,指向一篇进一步讨论此问题的文章?我如何从
BaseTreeNode*父级
调用特定于BiTreeNode的函数。例如:我有一个
位reenode n
,我想
(*n.getParent()).getData()
。这是怎么发生的?