2012-06-10 40 views
1

我的目标是创建一个带有不同类型节点的链表。对于这一点,我创建了一个节点类模板如下:我可以在类模板的方法内引用另一个模板类型的对象吗?

template <class T> 
class N_Node 
{ 
public: 
    N_Node(T e, N_Node *p = nullptr ,N_Node *n = nullptr); 
    void set_previous(N_Node<T> *p); 
    void set_next(N_Node<T> *n); 
    N_Node get_previous(); 
    N_Node get_next(); 

    T element; 
    N_Node *prev; 
    N_Node *next; 
}; 

现在,在main.cpp中,当我试图做到以下几点,它给了我一个错误说N_Node<int>*类型的参数与参数不符键入N_Node<char>*。所以,我想知道是否有任何方法可以指定设置为前一个的节点可以是与当前节点不同的类型?

N_Node<int> n1(5); 
N_Node<char> n3('g'); 
n3.set_previous(&n1); 
+0

请修复格式。 –

+0

抱歉,哪部分需要修复? – nave

+0

@nave查看当前版本(特别是Griwes的更改)并将其与原始版本进行比较。要比较版本,您可以点击帖子下方的“编辑过的X秒/分钟前”链接,将其保留在用户名旁边。 –

回答

1

当然,创建一个类N_Node_Base省略了element成员,并从它继承N_Node<T>。大多数C++标准库实现都是这样做的,以减少模板开销。

当然,通过这样做,您将失去遍历列表和访问元素的能力,因为您不知道每个元素的类型。您可能想要使用例如键盘擦除T的最小界面。 boost::any,但你必须多说一些你为什么要这样做。

+0

,目标是创建动态调整大小的异构列表。 – nave

+0

在托管/脚本语言中使用异构列表是有意义的,其中所有东西都是对象(或可以装入对象中)。在C++中,没有一个单一的基础'对象'类型(尽管大量的框架提供了一个),类似的拳击。你需要考虑你想要*做的事情*列表中的元素。 – ecatmur

+0

感谢您的建议。 – nave

相关问题