Нет соответствующего вызова функции - PullRequest
1 голос
/ 29 января 2012

Я новичок в C ++ и пытаюсь кодировать структуру данных HashTable. Я написал его как универсальный с использованием шаблонов, и я включил в него объект HashEntry для упрощения квадратичного зондирования столкновений. Код у меня есть:

(в файле .C, который # включает приведенное ниже определение класса .H файла):

   HashEntry::HashEntry()
   {
      this->isActive = false;
   }

И связанный файл .H с определениями классов:

#include <iostream>
#include <string>
#include "Entry.C" 
using namespace std;

#define Default_Size 50000

class HashEntry;

template <class T> class HashTable
{
private:
  int size;
  int occupied;
  T array[Default_Size];

public:
  HashTable();
  int Size();
  void Add(T t);
  void DebugAdd(T t, int index);
  T* Get(string index);
  /* How do I declare the existence of HashEntry BEFORE here? */
  int FindNextOpen(HashEntry he); // Only works for hash_entry objects!
  int Hash(string str);
  void Rehash();
};

class HashEntry
{
private:
  Entry e;
  bool isActive;

public:
  HashEntry();
  HashEntry(Entry e);
  bool IsActive();
  Entry GetEntry();
};

Всякий раз, когда я пытаюсь скомпилировать все, я получаю сообщение об ошибке для конструктора HashEntry выше: msgstr "нет подходящей функции для вызова Entry :: Entry ()" ... "кандидатами являются .....". Я понятия не имею, что это значит - когда я пытаюсь включить конструктор Entry () по умолчанию (моя первая интерпретация), он выдает больше ошибок.

Спасибо за помощь!

ОБНОВЛЕНИЕ - ENTRY.C:

#include "Entry.H"
/* ***Entry Methods*** */
/*
 * Overloaded Entry obejct constructor that provides a string value.
 */
Entry::Entry(string s)
{
  this->value = s;
  this->count = 0;
}

/*
 * Returns the number of times this Entry has been accessed/
 * found.
 */
int Entry::Count()
{ return this->count; }

/*
 * Returns the string value stored in the Entry object.
 */
string Entry::Value()
{ return this->value; }

Ответы [ 2 ]

3 голосов
/ 29 января 2012

И связанный файл .H с определениями классов:

#include <iostream>
#include <string>
#include "Entry.C"

Вау! Никогда, #include исходный файл в заголовке.

Ваш Entry.C не должен существовать. Вместо этого определите конструктор в своем заголовке внутри определения класса:

class HashEntry
{
private:
  Entry e;
  bool isActive;

public:
  HashEntry() : isActive(true) {}
...
}

Одна вещь, которую вы нам не показали, это определение класса Entry. Это один из источников вашей проблемы. Трудно определить вашу проблему, когда вы не показали нам, что именно ее вызывает.

0 голосов
/ 30 января 2012

Я нашел проблему. Сообщение об ошибке говорит, что не соответствует вызов функции для «Entry :: Entry ()». Поскольку ни в коем случае я не создавал объекты Entry, я понятия не имел, что это значит. Я попытался добавить явный конструктор по умолчанию для класса Entry, и он разрешился.

Спасибо за помощь всем!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...