【问题标题】:Fixed size list固定大小列表
【发布时间】:2011-08-16 12:55:47
【问题描述】:

我正在使用固定数组编写 FixedSizeList 类。我对固定大小的模板参数有疑问,我正在尝试了解我的解决方案是否正确以及如何解决我的问题。

基本上,这是我班级的骨架:

#pragma once

template <typename T, unsigned int N>
class SListFixed
{
public:
    SListFixed();

private:
    template <typename T>
    struct Node
    {
        Node(T value)
            :element(value), nextElement(0)
        {
        }

        T element;
        int nextElement;
    };

    Node m_data[N];
    int m_head;
    int m_tail;
    size_t m_elementCounter;
};

第一个问题是关于这个结构的正确性。然后我想了解为什么这段代码无法编译。我应该将 m_data 设为指针并将其分配到堆栈上吗?

谢谢。

【问题讨论】:

  • 您收到的编译器错误消息是什么?
  • @Oli Charlesworth:错误 C2148:数组的总大小不得超过 0x7fffffff 字节。
  • @enigma:那么你需要展示你正在实例化这个模板......
  • @Oli Charlesworth:例如,如果我调用 SListFixed。或者你的意思是构造函数的实现?
  • 您的 Node 对象无法知道它属于哪个容器,因此下一个元素可能无法工作。还有,为什么?如果你想要一个链表,你不希望它由一个数组支持。这就是向量的用途。

标签: c++ list templates


【解决方案1】:

要编译它,请更改

Node m_data[N];

Node<T> m_data[N];

因为Node毕竟是一个模板类。

也就是说,只需按照 Oli 所说的操作并从 Node 的定义中删除 template &lt;typename T&gt; 也可以,因为 T 是从 FixedSizeList 实例化中得知的。我建议这样做,因为Node 的类型永远不会与FixedSizeList 的类型不同。

不过,这个答案太明显了,我怀疑我在回答你的问题。如果我错过了什么,请告诉我。

【讨论】:

  • 是的,我解决了,我没有注意到缺少默认构造函数,抱歉。而且我还删除了内部模板定义。
  • @enigma,如果您喜欢这个答案,那么您可以通过检查点下方的“正确”标记接受它。
【解决方案2】:

很难准确地说这是否是一个好的解决方案,但从表面上看,它看起来还不错(尽管有编译器错误)。虽然我不太确定你为什么想要一个固定大小的列表;您可以动态调整列表的大小不是吗?为什么不只是一个数组/向量?

至于你的编译问题,内部类不需要template &lt;typename T&gt;;这已经是模板的一部分,并且T 是已知的。另外,Node 没有默认构造函数,所以 Node m_data[N] 不会编译。

【讨论】:

  • @Oli:这似乎是非类型模板参数的经典用法。这里没有什么太奇怪的地方。
  • @quamrana:我从来没有说过非类型参数是个问题!
  • @Oli:只是一个练习,我已经实现了一个使用 std::vector 作为容器的版本和一个使用指针的经典版本。
  • @Oli:问题似乎与m_data 成员有关,并且在编译时通过非类型参数知道它的大小。
  • @quamrana:一旦我修复了我在回答中提到的错误,我就不会遇到 OP 抱怨的问题(当我将其实例化为 SListFixed&lt;int,100&gt; my_list; 时)。所以他/她的调用代码等肯定有其他我们不知道的地方。
【解决方案3】:

根据定义,列表是可变大小的容器。为什么不简单地使用array 类?

【讨论】:

  • 正如我对 Oli Charlesworth 所说,这只是一种练习。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多