web-dev-qa-db-fra.com

demande de membre de type non classe

j'ai eu cette erreur et je ne suis pas capable de résoudre tout seul

source.cpp:85:8: error: request for member ‘put_tag’ in ‘aux’, which is of non-class type ‘Keyword()’
source.cpp:86:8: error: request for member ‘put_site’ in ‘aux’, which is of non-class type ‘Keyword()’
make: *** [source.o] Error 1

le code qui me donne cette erreur est

Keyword aux();
aux.put_tag(Word);
aux.put_site(site);

Je dois mentionner que Word et le site sont de type char *

Maintenant, ma définition de classe de mots-clés est celle-ci:

class Keyword{
 private:

std::string tag; 
Stack<std::string> weblist;

public:

    Keyword();
    ~Keyword();
    void put_tag(std::string Word)
    {
        tag = Word;
    }
    void put_site(std::string site)
    {
        weblist.Push(site);
    }

};

Merci beaucoup!

Mettre à jour

En modifiant 

Keyword aux();
aux.put_tag(Word);
aux.put_site(site);

dans

Keyword aux;
aux.put_tag(Word);
aux.put_site(site);

j'ai eu cette erreur:

source.o: In function `Algorithm::indexSite(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
source.cpp:(.text+0x2c6): undefined reference to `Keyword::Keyword()'
source.cpp:(.text+0x369): undefined reference to `Keyword::~Keyword()'
source.cpp:(.text+0x4a8): undefined reference to `Keyword::~Keyword()'
source.o: In function `Keyword::put_site(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
source.cpp:(.text._ZN7Keyword8put_siteESs[Keyword::put_site(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)]+0x2a): undefined reference to `Stack<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::Push(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
collect2: ld returned 1 exit status
make: *** [tema3] Error 1
6
sniperu

Cette ligne ne fait pas ce que vous pensez:

Keyword aux();

Déclare une fonction appelée aux qui ne prend aucun argument et retourne une Keyword. Vous vouliez probablement écrire (sans les parenthèses):

Keyword aux;

Qui déclare un objet de type Keyword.

METTRE À JOUR:

En ce qui concerne la prochaine erreur que vous obtenez, cela est dû au fait que vous avez une déclaration du constructeur et du destructeur de votre classe, mais pas une definition . En fait, l'erreur que vous obtenez provient du linker , et non du compilateur.

Pour fournir une définition triviale de votre constructeur et de votre destructeur, changez ceci:

Keyword();
~Keyword();

Dans ceci:

Keyword() { }
~Keyword() { }

Ou, tant que ces fonctions membres ne font rien, omettez-les simplement du tout - le compilateur les générera pour vous (sauf si vous ajoutez un autre constructeur déclaré par l'utilisateur, en ce qui concerne le constructeur).

17
Andy Prowl

Pas ça

Keyword aux();
aux.put_tag(Word);
aux.put_site(site);

mais ça

Keyword aux;
aux.put_tag(Word);
aux.put_site(site);

Dans votre version, Keyword aux(); est un prototype de function pas une déclaration de variable.

3
john

J'ai eu le même problème lorsque j'ai tapé le code suivant dans ma fonction principale, j'ai un fichier List.h et List.cpp contient ma classe List.

List<int,int> myList();
bool x=myList.isEmpty();

Je reçois une erreur "requête pour le membre 'isEmpty" dans "myList", qui est de type non-classe' List () '"

l'erreur est due au fait que le compilateur considère myList () comme un prototype de fonction 

quand je corrige le code pour être 

List<int,int> myList;
bool x=myList.isEmpty();

J'ai eu l'erreur "référence indéfinie à` List :: List () "et quelques erreurs similaires pour le destructeur.

Suite à l'examen de mon code et de mes réponses dans cette page, j'ai constaté que je devais inclure mon fichier List.cpp dans le fichier main.cpp. Cependant, j'ai inclus List.h dans mon fichier List.cpp, mais il semble que cette information doit être communiquée à le fichier principal également. lectures supplémentaires pour ce tutoriel expliquer pourquoi, si je compile le projet sans inclure List.cpp, il compilera correctement car le fichier List.h a le prototype mais il échouera à l'étape de l'éditeur de liens, car l'éditeur de liens serait incapable de résoudre l'appel de List () vers une fonction spécifique.

0
newComer