我有错误:当我尝试编译以下代码时无效使用非静态成员函数:
rows, err := db.Query(q)
if err != nil {
fmt.Println(err)
}
defer rows.Close()
for rows.Next() {
var data string // same database type
if err := rows.Scan(&data); err != nil {
log.Fatal(err)
}
fmt.Println(data)
}
收到错误:
int main()
{
data d;
cta ce;
pthread_t thread1;
pthread_t thread2;
pthread_create( &thread1, NULL, d.subscribe, NULL );
pthread_create( &thread2, NULL, ce.startStrategy, NULL );
pthread_join(thread1,NULL);
pthread_join(thread2,NULL);
return 0;
}
// cta.cpp
// ...
static void* cta::startStrategy()
{
std::cout<<"haha"<<std::endl;
}
// data.cpp
// ...
static void* data::subscribe()
{
std::cout<<"haha"<<std::endl;
}
但是,类似的代码段工作得很好:
main.cpp:38:52: error: invalid use of non-static member function
pthread_create( &thread1, NULL, d.subscribe, NULL );
^
main.cpp:39:60: error: invalid use of non-static member function
pthread_create( &thread2, NULL, ce.startStrategy, NULL );
它编译得很好并打印“hi”两次,我想知道我的代码可能有什么问题,因为我已经从void更改为static void并遵循相同的模式,为什么我仍然会得到非静态错误?
答案 0 :(得分:1)
首先,不要使用pthread
。使用C ++ std::thread
,实现快乐。
见证这个:
std::thread t1(&data::subscribe, &d);
std::thread t2(&cta::start_strategy, &ce);
其次,问题的最可能原因是static
修饰符应该用在类定义(.h文件)中,而不是在类外的函数定义中。
答案 1 :(得分:-1)
如果你要使用pthread_create
,你必须传递它想要的参数。启动例程为void *(*start_routine) (void *)
。请注意,那里的任何成员函数都没有,static
或其他。所以代码是不正确的,即使它恰好在某个平台上运行。