在基类中调用真正的虚函数

时间:2014-06-09 17:15:48

标签: c++ multithreading visual-studio-2010 virtual

编辑:正确的标题应该是“在基类中调用重载的真实虚函数”,因为这是问题的一个重要部分。

我有一个具有真正虚函数的基类和一些其他正常函数。其中一个正常的函数在一个线程中调用虚函数,我在该行中得到一个错误,我不明白。我想它与线程有关,但由于基类是抽象的,并且每个派生类都必须实际实现虚函数,所以应该没有问题。也许这是完全不同的东西。这或多或少看起来像:

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

2 个答案:

答案 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。 :)