试图引用已删除的功能。

时间:2016-10-28 19:30:02

标签: c++

我的代码有问题。我收到错误" AssociativeArray> :: Node :: Node(void)':尝试引用已删除的函数"

这是我的班级

template<typename K, typename V>
class AssociativeArray
{
  public:
    AssociativeArray(int = 2);  // default constructor of a capacity of 2
    AssociativeArray(){ delete [] data; }
    AssociativeArray(const AssociativeArray<K,V>&); 
    AssociativeArray<K,V>& operator=(const AssociativeArray<K,V>&);
    V& operator[](const K&); // getter
    V operator[](const K&) const;  // setter
    queue<K> keys() const;
    int size() const {return siz;};
    bool containsKey(const K&) const;
    void deleteKey(const K&);
    void clear();

  private: 
    int cap;
    int siz;
    int values;
    void capacity(int);
    struct Node{K key; V value; bool inUse;};
    Node* data;  // data = new Node[cap]
    void ExpandNode(int,int);
};

这是给我问题的构造函数。

template<typename K, typename V>
AssociativeArray<K, V>::AssociativeArray(int cap)
{
  this->cap = cap;
  this->siz = 0;

  data = new Node[cap];  // ERRORS HERE

  for (int index = 0; index < cap; index++)
  {
    data[index].inUse = false;
  }
}

以下是main中的声明。

AssociativeArray<string, AssociativeArray<string, bool>> seen(10);

2 个答案:

答案 0 :(得分:1)

问题是没有析构函数。我忘了在“AssociativeArray(){delete [] data;}前面添加〜”因此我怀疑我有2个构造函数,它正在调用删除数据数组的构造函数。

答案 1 :(得分:0)

Node班级&#39;当您创建Node的原始数组时,默认构造函数用于每个项目。

由于某种原因,没有这样的默认构造函数。据推测,Key成员缺少默认构造函数。但是,您没有显示代码,因此关于原因仅仅是推测。

创建数组而不调用项类型的默认构造函数的一种好方法是使用std::vector。或者,如果这样做有意义,那么您可以只定义一个默认构造函数。但是使用std::vector也可以处理许多其他问题,所以我建议你不管怎么做。