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()
。这是怎么发生的?