可以容纳任何类型的c ++模板链接列表

时间:2018-11-09 01:55:33

标签: templates types

如何定义一个列表,它可以容纳c ++中不同类型的对象,就像python list一样?我尝试了以下代码

#include <iostream>

template< typename t >
struct Node {
    t val;
    Node *next;
};

int main() {
    Node<int> a;
    a.val = 1;
    Node<char> b;
    b.val = 'b';
    a.next = &b;
    b.next = NULL;
}

但是编译器给出以下错误:

main.cpp:14:15: error: cannot convert 'Node<char>*' to 'Node<int>*' in 
assignment
     a.next = &b;
           ^

1 个答案:

答案 0 :(得分:0)

此代码有两个问题,首先是Node的下一个成员未定义模板类型,通常在这种情况下,如果您要创建一个通用类型的链表,则需要执行以下操作Node<t>* next。第二个事实是您正在将似乎​​是Node *的分配给Node *。

如果您要创建的链表类型不同,则无法使用此方法。简而言之,原因是您必须传递t参数的类型,因此每个节点都必须具有 defined 类型。模板类的目的不是允许用户随意分配任何泛型类型,而是通过允许您将类型作为参数传递来简化类的重复实现。例如:List<int>List<char>IntListCharList的类简化了您的工作。

如果您想要在同一数组中存储任何动态分配的类型的行为,那么就不那么容易了。我建议您查看c ++ 17 std::anystd::variant类型,或者如果语言的旧版本是boost库中的boost boost::anyboost::variant类型。没有标准库的其他方法是使用多态性或void*