模板类赋值运算符重载

Template Class Assignment Operator Overloading

本文关键字:重载 赋值运算符      更新时间:2023-10-16

我在以下方面遇到了一点麻烦:

我正在为一些课程编写地图抽象数据类型,并且在尝试将我的类(MapEntry - 下图)的对象分配给类 MapADT 中相同类型的数组时遇到了一个问题。它告诉我:

错误

1 错误 C2679:二进制"=":找不到采用类型为"MapEntry *"的右侧操作数的运算符(或者没有可接受的转换) c:\users\cross_000\documents\Visual Studio 2013\projects\objectoriented methodsasignment1\mapadt\mapadt.h 14

所以我想我会编写自己的赋值运算符覆盖。我已经在 MapEntry 类定义中完成了此操作,但是当我尝试在 MapADT 上的构造函数中初始化数组时,编译器似乎无法识别它 - 如下。

任何帮助将不胜感激。

#pragma once
template <class Tk, class Tc>
class MapEntry
{
private:
    Tk key;
    Tc contents;
    bool isPopulated;
public:
    MapEntry() {
    }
    MapEntry(Tk keyInput, Tc contentsInput) {
        key = keyInput;
        contents = contentsInput;
        isPopulated = true;
    }
    MapEntry(Tk keyInput, Tc contentsInput, bool isPopulatedInput) {
        key = keyInput;
        contents = contentsInput;
        isPopulated = isPopulatedInput;
    }
    ~MapEntry() {
        //TODO
    }
    Tk getKey() {
        return key;
    }
    void setKey(Tk keyInput) {
        key = keyInput;
    }
    Tc getContents() {
        return contents;
    }
    void setContents(Tc contentsInput) {
        contents = contentsInput;
    }
    bool getIsPopulated() {
        return isPopulated;
    }
    void setIsPopulated(bool isPopulatedInput) {
        isPopulated = isPopulatedInput;
    }
    MapEntry<Tk, Tc>& operator=(const MapEntry<Tk, Tc> & lst)
    {
        clear();
        copy(lst);
        return *this;
    }
};

MapADT.h

#pragma once
#include "MapEntry.h"
template <class Tk, class Tc>
class MapADT
{
private:
    int mapSize = 1000;
    MapEntry<Tk, Tc> *map;
public:
    MapADT() {
        map = new MapEntry<Tk, Tc>[mapSize];
        for (int i = 0; i < mapSize; i++) {
            map[i] = new MapEntry<Tk, Tc>(NULL, NULL, false);
        }
    }
}

MapADT类还有更多内容,但我认为它无关紧要。如果您需要查看整个内容,我可以添加它。

map[i]不是指向MapEntry的指针。

不确定是否要

map[i] = MapEntry<Tk, Tc>(NULL, NULL, false);

MapEntry<Tk, Tc>** map;
MapADT() {
    map = new MapEntry<Tk, Tc>*[mapSize];
    for (int i = 0; i < mapSize; i++) {
        map[i] = new MapEntry<Tk, Tc>(NULL, NULL, false);
    }
}

以解决您的问题。

在这一行中

map = new MapEntry<Tk, Tc>[mapSize];

你分配一个MapEntry<Tk, Tc>数组,并为所有这些数组调用默认构造函数。在后续的for循环中根本不需要,您应该在当前为空的 MapEntry::MapEntry() 中编写正确的初始化。