Метод друга "не объявлен в этой области" в C ++ - PullRequest
2 голосов
/ 08 марта 2012

Сначала предоставим некоторый контекст, это для назначения, включающего семафоры.Мы должны найти код для проблемы столовых философов, заставить его работать, а затем выполнить некоторый анализ и манипулирование.Однако я застрял с ошибкой.

Оригинальный код взят из http://www.math -cs.gordon.edu / courses / cs322 / projects / p2 / dp / с использованием решения C ++.

Я получаю в Code :: Blocks ошибку

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

, и эта ошибка возникает в строке:

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

Я посмотрел метод pthread_create, но не смог это исправитьошибка.Если бы кто-нибудь мог объяснить мне, как исправить эту ошибку, а также почему она возникает, я был бы очень признателен.Я пытался предоставить только соответствующий код.

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 )

1 Ответ

4 голосов
/ 08 марта 2012

Объявление друга не делает имя друга видимым без поиска, зависящего от аргумента.

§7.3.1.2 [namespace.memdef] p3

[...] Если объявление friend в нелокальном классе сначала объявляет класс или функцию, дружественный класс или функция является членом внутреннего вложенного пространства имен. Имя друга не найдено ни в неквалифицированном поиске, ни в квалифицированном поиске, пока не будет предоставлено соответствующее объявление в этой области имен (до или после определения класса, предоставляющего дружбу). [...]

Это означает, что вы должны поместить void Philosopher_run( Philosopher* p ); либо перед классом (вместе с предварительным объявлением Philosopher), либо после класса (сохраняя объявление друга внутри класса).

...