Mister R2
Mister R2

Reputation: 881

No Matching Function Call

I'm new to C++ and trying to code a HashTable data structure. I've written it to be generic using templates, and I've included a HashEntry object to use in it to allow for easy quadratic probing for collisions. The code I have is:

(in a .C file that #include's the below class definition .H file):

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

And the associated .H file with the class definitions is:

#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();
};

Whenever I try and compile everything, I get the error for the HashEntry constructor above: "no matching function for call to Entry::Entry()" ... "candidates are.....". I have no idea what it means -- when I try to include a default Entry() constructor (my first interpretation), it throws more errors.

Thanks for the help!

UPDATE -- 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; }

Upvotes: 1

Views: 2083

Answers (2)

Mister R2
Mister R2

Reputation: 881

I found the problem. The error message says there is not matching function call for "Entry::Entry()". Because in no case was I actually creating Entry objects I had no idea what it meant. I tried adding an explicit default constructor for class Entry and it resolved.

Thanks for the help everyone!

Upvotes: 0

David Hammen
David Hammen

Reputation: 33136

And the associated .H file with the class definitions is:

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

Whoa! Never, ever #include a source file in a header.

Your Entry.C should not exist. Instead define the constructor in your header, inside the class definition:

class HashEntry
{
private:
  Entry e;
  bool isActive;

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

One thing that you haven't shown us is the definition of the class Entry. That is one of the sources of your problem. It's a bit hard to pin down your problem when you didn't show us the very thing that is causing it.

Upvotes: 4

Related Questions