2013-05-27 2 views
0

Salut J'essaie de comprendre la portée des fonctions ami et j'obtiens une erreur "non déclaré dans la portée". Voici mon code:La fonction ami n'est pas déclarée dans cette erreur d'erreur

//node.h 
class Node{ 

public: 

    int id; 
    int a; 
    int b; 

    friend int add(int,int); 

    void itsMyLife(int); 
    Node(); 
}; 

//node.cpp 
Node::Node(){ 
    a=0; 
    b=0; 
    id=1; 
} 

void Node::itsMyLife(int x){ 

    cout<<"In object "<<id<<" add gives "<<add(x,a)<<endl; 

} 

//routing.cpp 
#include "node.h" 

int add(int x, int y){ 

    return x+y; 
} 

//main.cpp 
#include "node.h" 

int main(){ 

return 0; 
} 

Je reçois l'erreur "ajouter non déclaré dans cette portée" dans node.cpp. Pourquoi ai-je cette erreur lorsque j'ai déclaré la fonction dans la portée de la classe? Toute aide serait appréciée. Merci

+0

AFAIK déclaration d'ami est également une déclaration avant. Si j'ai raison, il ne devrait pas y avoir d'erreur. Peut-être le voit-il comme dans la portée de la classe (bien que cela n'ait pas beaucoup de sens pour une fonction ami), essayez d'ajouter: avant d'ajouter dans la déclaration d'ami pour déclarer qu'il est dans la portée globale. Peut-être que ça va aider. – selalerer

+0

En fait, le problème disparaît si je définis la fonction add dans node.cpp. Mais je veux le définir dans un fichier séparé. Comment puis je faire ça? – user2105632

Répondre

2

À l'intérieur de votre classe de nœud, vous déclarez une fonction d'ami int add (int, int). Cependant, actuellement le compilateur n'a pas encore rencontré la fonction et par conséquent il est inconnu.

Vous pouvez créer un en-tête et un fichier source distincts pour votre fonction d'ajout. Ensuite, dans node.h, incluez votre nouvel en-tête. Parce que dans le fichier où vous déclarez Node, la fonction add n'est pas connue actuellement. Par exemple, vous pouvez créer un fichier add.h et un fichier add.cpp et ajouter add.h avant de déclarer Node. N'oubliez pas de compiler aussi add.cpp.

+0

Merci pour la réponse, mais ce n'est pas l'objectif de ma question. Je veux savoir pourquoi une fonction membre ne peut pas appeler une fonction ami quand la fonction ami a déjà été déclarée dans la classe? En fait, je veux appeler la fonction friend dans une fonction membre et la fonction friend doit accéder à certaines variables membres privées de la classe (non affichées dans le code pour plus de simplicité). Merci – user2105632

0

Vous n'avez pas déclaré la fonction.

extern int add(int, int); 
+0

Dans quel fichier dois-je mettre cette déclaration? – user2105632

+1

merci! Obtenu que! En fait, le problème disparaît si je définis la fonction add dans node.cpp. Mais je voulais le définir dans un fichier séparé. Pourquoi devons-nous le déclarer séparément avec extern dans le fichier d'en-tête? – user2105632

+1

Le compilateur doit connaître les empreintes digitales d'une fonction avant de pouvoir produire du code pour l'appeler correctement (vous pouvez avoir des variantes de 'add' avec différents types d'arguments: long, float, double, char, etc.) ou des valeurs par défaut. Vous avez donc besoin d'une déclaration prototype pour la fonction avant de l'appeler, et la définition "friend" ne compte pas comme une déclaration prototype (ce serait un contexte étrange dans lequel déclarer une fonction non-membre). – kfsone

0

C'est un bug du côté Linux. Le code devrait fonctionner. J'ai du code en ce moment qui compile bien du coté de Windows et quand je le déplace vers le coté Linux je reçois la même erreur. Apparemment, le compilateur que vous utilisez du côté Linux ne voit/n'utilise pas la déclaration d'ami dans le fichier d'en-tête et donne donc cette erreur. En déplaçant simplement l'implémentation de la fonction friend dans le fichier C++ AVANT l'utilisation de cette fonction (par exemple, comme cela peut être utilisé dans l'assignation de callback de fonction), ceci résout mon problème et devrait également résoudre le vôtre.

Meilleures salutations

+0

Commentaire précédent aurait dû lire: C'est un bug sur le côté Linux. Le code devrait fonctionner comme écrit. J'ai du code en ce moment qui compile bien du coté de Windows et quand je le déplace vers le coté Linux je reçois la même erreur. Apparemment, le compilateur que vous utilisez du côté Linux ne voit/n'utilise pas la déclaration d'ami dans le fichier d'en-tête et donne donc cette erreur. En déplaçant simplement la définition/l'implémentation de la fonction friend dans le fichier C++ * BEFORE * l'utilisation de cette fonction (par exemple, comme dans l'affectation de callback de fonction), cela résout mon problème. – DJR

+0

J'ai le même problème. Veuillez expliquer précisément ce que vous voulez dire en déplaçant la définition de la fonction friend dans le fichier C++ avant l'utilisation de la fonction. Je ne comprends pas ce que cela signifie. Aidez-moi, s'il vous plaît. –

Questions connexes