【问题标题】:Can I refer to an object of another template type inside the class template’s method?我可以在类模板的方法中引用另一个模板类型的对象吗?
【发布时间】:2012-06-10 13:58:13
【问题描述】:

我的目标是创建一个包含不同类型节点的链表。为此,我创建了一个节点类模板如下:

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&lt;int&gt;* 类型的参数与 N_Node&lt;char&gt;* 类型的参数不兼容。所以,我想知道是否有任何方法可以指定设置为前一个的节点可以是与当前节点不同的类型?

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

【问题讨论】:

  • 抱歉,哪一部分需要修复?
  • @nave 查看当前版本(特别是 Griwes 的更改)并将其与您的原始版本进行比较。要比较版本,您可以点击帖子下方的“已编辑 X 秒/分钟前”链接,位于您的用户名旁边。
  • 好的,我明白了。感谢您的更改..他们使问题更清晰

标签: c++ templates linked-list


【解决方案1】:

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

当然,这样做您将失去遍历列表和访问元素的能力,因为您不知道每个元素的类型。您可能希望使用例如键入擦除 T 的最小接口。 boost::any,但您必须详细说明您为什么要这样做。

【讨论】:

  • 好吧,我们的目标是创建一个动态调整大小的异构列表。
  • 在托管/脚本语言中拥有异构列表是有意义的,其中一切都是对象(或可以装箱成对象)。在 C++ 中,没有单一的基本 object 类型(尽管很多框架都提供了一种),拳击也是如此。您需要考虑要列表的元素做什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-06
  • 1970-01-01
  • 2018-10-25
  • 1970-01-01
  • 2014-11-06
相关资源
最近更新 更多