2012-03-07 10 views
1

D'abord pour fournir un contexte, ceci est pour une affectation impliquant des sémaphores. Nous devons trouver un code pour le problème des philosophes à manger, le faire fonctionner, puis effectuer quelques analyses et manipulations. Cependant, je suis coincé avec une erreur.Méthode Friend "non déclarée dans cette portée" en C++

Le code original provient de http://www.math-cs.gordon.edu/courses/cs322/projects/p2/dp/ en utilisant la solution C++.

L'erreur que je reçois dans Code :: Blocks est

philosopher.cpp|206|error: 'Philosopher_run' was not declared in this scope| 

et cette erreur se produit dans la ligne:

if (pthread_create(&_id, NULL, (void *(*)(void *)) &Philosopher_run, 
     this) != 0) 

J'ai regardé la méthode pthread_create mais ont été incapables de fixer cette erreur. Si quelqu'un pouvait m'expliquer comment corriger cette erreur, et aussi pourquoi cette erreur se produit, je l'apprécierais grandement. J'ai essayé de fournir seulement le code approprié. Une déclaration d'ami ne rend pas le nom de l'ami visible sans recherche dépendant de l'argument.

class Philosopher 
{ 
private: 
    pthread_t _id; 
    int  _number; 
    int  _timeToLive; 

public: 
    Philosopher(void) { _number = -1; _timeToLive = 0; }; 
    Philosopher(int n, int t) { _number = n; _timeToLive = t; }; 
    ~Philosopher(void)  {}; 
    void getChopsticks(void); 
    void releaseChopsticks(void); 
    void start(void); 
    void wait(void); 
    friend void Philosopher_run(Philosopher* p); 
}; 

void Philosopher::start(void) 
// Start the thread representing the philosopher 
{ 
    if (_number < 0) 
    { 
    cerr << "Philosopher::start(): Philosopher not initialized\n"; 
    exit(1); 
    } 
    if (pthread_create(&_id, NULL, (void *(*)(void *)) &Philosopher_run, 
     this) != 0) 
    { 
    cerr << "could not create thread for philosopher\n"; 
    exit(1); 
    } 
}; 

void Philosopher_run(Philosopher* philosopher) 

Répondre

3

§7.3.1.2 [namespace.memdef] p3

[...] Si une déclaration friend dans une classe nonlocal déclare d'abord une classe ou fonction de la classe d'ami ou la fonction est un membre de l'espace de noms englobante la plus profonde. Le nom de l'ami n'est pas trouvé par une recherche non qualifiée ou par une recherche qualifiée jusqu'à ce qu'une déclaration correspondante soit fournie dans cet espace de noms (avant ou après la définition de classe accordant l'amitié). [...]

Ce qui signifie que vous devez mettre void Philosopher_run(Philosopher* p); soit avant la classe (avec une déclaration avant de Philosopher), ou après la classe (tout en gardant la déclaration d'ami dans la classe).

Questions connexes