2014-05-13 2 views
0

C'est une sorte de question compliquée.Utilisez un modèle avec le type cstring en tant que membre de données dans une classe sans modèle

class Stats { 
public: 
    Stats(); 

     // some functions 

    QuadraticHashTable<char[4]> teamHash; 
}; 

En raison des exigences, je dois utiliser le modèle QuadraticHashTable à chaîne de style magasin de c et je dois définir un élément de données de type QuadraticHashTable dans la classe Stats, ce qui est un modèle. Quelqu'un peut me dire ce qui ne va pas avec ma déclaration?

Le compilateur ne cesse de me dire que

« pas de fonction concordante pour appel à « QuadraticHashTable :: QuadraticHashTable() » »

BTW, j'initialiser pas le membre de données dans le constructeur pour Stat

Remerciez toi.

code pour QuadraticHashTable

 template <class HashedObj> 
     class QuadraticHashTable 
     { 
      public: 
      explicit QuadraticHashTable(const HashedObj & notFound, int size = 101); 
      QuadraticHashTable(const QuadraticHashTable & rhs) 
       : array(rhs.array), ITEM_NOT_FOUND(rhs.ITEM_NOT_FOUND), 
       currentSize(rhs.currentSize) { } 

      const HashedObj & find(const HashedObj & x) const; 

      void makeEmpty(); 
      void insert(const HashedObj & x); 
      void remove(const HashedObj & x); 

      const QuadraticHashTable & operator=(const QuadraticHashTable & rhs); 

      enum EntryType { ACTIVE, EMPTY, DELETED }; 
///////////////////////////////////////////////////// 
      friend class Stats; 
///////////////////////////////////////////////////// 
      private: 
      struct HashEntry 
      { 
       HashedObj element; 
       EntryType info; 

       HashEntry(const HashedObj & e = HashedObj(), EntryType i = EMPTY) 
        : element(e), info(i) { } 
      }; 

      vector<HashEntry> array; 
      int currentSize; 
      const HashedObj ITEM_NOT_FOUND; 
      bool isPrime(int n) const; 
      int nextPrime(int n) const; 
      bool isActive(int currentPos) const; 
      int findPos(const HashedObj & x) const; 
      int hash(const string & key, int tableSize) const; 
      int hash(int key, int tableSize) const; 
      void rehash(); 
     }; 
+0

Nous avons besoin du code d'en-tête pour 'QuadraticHashTable' pour vous aider. –

+0

Je ne pense pas que ce soit un problème, puisqu'il s'agit d'un code modèle fourni par le professeur – Bruce

+1

Cette classe a-t-elle un constructeur par défaut – rerun

Répondre

0

Cette classe n'a pas de constructeur par défaut. Chaque fois que votre classe a un membre qui n'a pas de constructeur par défaut, vous devez explicitement appeler un constructeur non par défaut lorsque vous construisez votre objet. Si le membre a un constructeur par défaut (read parameterless), il est appelé par défaut.

Par exemple, le suivant reconstitue votre problème

template <class T> 
class Member 
{ 
public: 
    Member(T obj) 
     :m_obj(obj) 
    { 

    } 
private: 
    T m_obj; 
}; 

class Owner 
{ 
public: 
    Owner() 
    { 
    } 

private: 
    Member<int> m_member; 
}; 

Dans VS je reçois un peu plus clair message d'erreur erreur « Membre »: aucun constructeur par défaut approprié disponible, mais c'est le même problème que le compilateur ne savoir comment construire un membre dans ce contexte parce que vous ne lui avez pas dit comment le construire.

Si je change la classe Owner pour appeler le constructeur approprié lors de l'initialisation, le compilateur sait maintenant comment construire votre objet.

class Owner 
{ 
public: 
    Owner() 
     :m_member(4) 
    { 
    } 

private: 
    Member<int> m_member; 
}; 
+0

Merci beaucoup, réexécutez. Je l'ai juste arrangé en faisant le membre de données teamTable le pointeur vers le QuadraticHashTable . Mais il y a un autre problème ici (c'est pourquoi j'ai dit que c'est un peu compliqué). Comme le nom de type du template est , je ne sais pas comment initialiser le membre de données teamHash dans le constructeur Stat. – Bruce

+0

A l'intérieur du constructeur Stat, j'utilise teamHash = new QudraticHashTable ('\ 0', 30); La variable notfound provoque toujours des problèmes. Je ne sais pas le réparer. – Bruce

Questions connexes