首先提供一些上下文,这是一个涉及信号量的赋值。我们要找到餐饮哲学家问题的代码,让它工作,然后进行一些分析和操作。但是,我遇到了一个错误。
原始代码取自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 )
答案 0 :(得分:4)
如果没有依赖于参数的查找,朋友声明不会使朋友的名字可见。
§7.3.1.2 [namespace.memdef] p3
[...]如果非本地类中的
friend
声明首先声明一个类或函数,那么友元类或函数是最内层封闭命名空间的成员。 在该命名空间范围内提供匹配声明(在授予友谊的类定义之前或之后),通过非限定查找或限定查找找不到朋友的姓名。 [...]
这意味着您应该将void Philosopher_run( Philosopher* p );
放在类之前(与Philosopher
的前向声明一起),或者在类之后(同时将好友声明保留在类中)。