首页 > 解决方案 > c++模板链表,可以保存任何类型

问题描述

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

#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;
           ^

标签: templatestypes

解决方案


这段代码有几个问题,首先是 Node 的下一个成员没有定义模板类型,通常在这种情况下,如果你想创建一个泛型类型的链表,你会做类似Node<t>* next. 其次是您将看似 Node* 的内容分配给 Node*。

如果您要做的是创建一个不同类型的链接列表,那么您不能这样做。简单地说,原因是你必须为t参数传入一个类型,因此每个节点都必须有一个定义的类型。模板类的目的不是让用户随意分配任何泛型类型,而是通过允许您将类型作为参数传递来简化类的重复实现。举个例子:a List<int>vs aList<char>让你不必创建一个IntList类和一个CharList类。

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


推荐阅读