编辑:正确的标题应该是“在基类中调用重载的真实虚函数”,因为这是问题的一个重要部分。
我有一个具有真正虚函数的基类和一些其他正常函数。其中一个正常的函数在一个线程中调用虚函数,我在该行中得到一个错误,我不明白。我想它与线程有关,但由于基类是抽象的,并且每个派生类都必须实际实现虚函数,所以应该没有问题。也许这是完全不同的东西。这或多或少看起来像:
class Base {
virtual int getInfo(int a) = 0; // the culprit?
void getInfo(); // is implemented, calls getInfo(int); Does
// actually have the same name. Works perfectly fine.
void getThreadedInfo(); // for details, see below
}
// ..later..
Base::getThreadedInfo() {
...
for(int i=0; i<maxThreads; i++) {
threads.push_back(thread(getInfo, i)); // this is line 85
}
...
}
完整的错误消息是:
Error 1 error C3867: 'Base::getInfo': function call missing argument list; use '&Base::getInfo' to create a pointer to member
c:\path\to\base.cpp 85 1 Project
Error 2 error C2661: 'std::thread::thread' : no overloaded function takes 2 arguments
c:\path\to\base.cpp 85 1 Project
答案 0 :(得分:1)
您可以使用以下内容:
threads.push_back(std::thread(static_cast<int (Base::*)(int)>(&Base::getInfo), this, i));
&Base::getInfo
不明确。
答案 1 :(得分:1)
你有几件不同的事情发生。
第一个最简单的修复方法是第一条错误消息告诉您的内容 - 您需要在&
的参数列表中使用getInfo
运算符和thread
创建一个函数指针。
第二个问题是在getInfo
的构造函数中调用thread
需要另外一个参数。除了显式int a
之外,由于getInfo
不是静态的,因此它采用隐式Base* this
。因此需要添加this
。
第三个最棘手的问题是Base
有两个getInfo
重载,所以你需要明确哪个重载。
把所有三件事放在一起,你需要......正是我在打字时所说的this answer。 :)