【问题标题】:"array type not assignable" in a templated stack C++模板化堆栈 C++ 中的“数组类型不可分配”
【发布时间】:2021-02-24 13:52:28
【问题描述】:

我正在使用 C++ 中的这个模板堆栈:

节点:

template <typename TS>
    struct spNodoPila {
        TS info;
        spNodoPila<TS>* next;
    };

具有推送和弹出功能的堆栈 ADT 结构:

template <typename TS>
    struct ADTPila {
        spNodoPila <TS>* head = NULL;
        spNodoPila <TS>* pos = NULL;

        
        void push(TS dato) {
            spNodoPila<TS>* nodo = new spNodoPila<TS>();
            nodo->info = dato;
            nodo->next = NULL;
            if (head == NULL) {
                head = nodo;
            }
            else {
                nodo->next = head;
                head = nodo;
            }
        }
        void pop(spNodoPila<TS>*& nodo) {
            nodo = new spNodoPila<TS>();
            if (head == NULL) {

            }
            else if (head->next != NULL) {
                nodo = head;
                pos = head->next;
                delete(head);
                head = pos;
                pos = NULL;
            }
            else {
                nodo = head;
                delete(head);
                head = NULL;
            }
        }
    };

在前一个结构开头的这段代码中,我在最后一行得到错误“数组类型 TS 不可分配”:

spNodoPila<TS>* nodo = new spNodoPila<TS>();
            nodo->info = dato;

需要强调的重要一点是,稍后在代码中我将堆栈作为 str (char[60] typedef) 进行实例化,因为我希望该堆栈能够处理该类型的数据。删除“str”的那些实例,程序编译,所以我想分配char数组的内存可能有问题,或者我正在做某事的方式。实例示例:

Stak 模板 ADTPila 以 "str" (char[60] typedef) 实例化到列表节点中:

struct spNodoLista {
        sInfoLista info;    
        ADTPila <str> cand;
        spNodoLista* prev;
        spNodoLista* next;
        spNodoVotos* vlink;
    };

非常感谢您的帮助!

【问题讨论】:

  • 错误信息说明了一切——你不能将一个 C 样式数组分配给另一个,所以这一行 nodo-&gt;info = dato 将失败。
  • 你不能用原始数组来做这个。您可以使用std::array&lt;char&gt;,但基于名称“str”,我认为std::string 或简单的包装器(struct mystring { char s[60];};) 可能是更好的选择。
  • 包含代码中的这个数组在哪里?我没有看到。很高兴看到与实际问题相关的代码。

标签: c++ templates stack dynamic-memory-allocation


【解决方案1】:

由于历史原因,原始数组类型被认为是引用类型。:它们不能被显式复制或分配。但是您可以将字符串包装在结构中作为一种解决方法:

struct str{
    char value[60];
};

或使用std::array 代替,它基本上可以更方便和轻松地做同样的事情:

#include <array>
using str= std::array<char,60>;

但不要更改模板的基本实现。您可能希望将模板专门用于原始数组类型或使用特征来增加模板的灵活性,但这是一个单独的长篇故事。

干杯, 调频。

【讨论】:

    【解决方案2】:

    就像评论部分指出的那样,问题很简单:我试图在“nodo->info = dato;”中直接将一个 char 数组分配给另一个,所以我用 strcpy(dato->info,dato )。

    【讨论】:

    • 这不适用于任何其他类型,因此它使模板变得毫无意义。
    • 如上所述,如果您将模板类型 TS 更改为 int,这将不起作用。
    • 是的,我预料到了这一点,而且确实我也想使用 int,所以我可以做的最好的 atm 以使模板有意义的是在使用函数时始终使用 str,但是当我需要使用 int 时,我会预先将它们转换为 str,如果我必须提取数据,反之亦然。
    猜你喜欢
    • 2012-10-04
    • 2021-06-23
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多