【问题标题】:Calling true virtual function in base class在基类中调用真正的虚函数
【发布时间】:2014-06-09 17:15:47
【问题描述】:

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

我有一个带有真正虚函数的基类和其他几个普通的。其中一个正常调用线程中的虚函数,我在该行中收到错误,我不明白。我猜这和线程有关,但是由于基类是抽象的,每个派生类都必须实际实现虚函数,应该没有问题。也许这是完全不同的东西。这或多或少是这样的:

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

【问题讨论】:

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


    【解决方案1】:

    你可以使用类似的东西:

    threads.push_back(std::thread(static_cast<int (Base::*)(int)>(&Base::getInfo), this, i));
    

    因为&amp;Base::getInfo 是模棱两可的。

    【讨论】:

    • 我认为过载可能是问题所在,感谢您展示它是如何完成的。
    【解决方案2】:

    你有几个不同的事情发生。

    第一个最简单的解决方法是第一条错误消息告诉您的内容 - 您需要在 thread 的参数列表中使用 &amp; 运算符和 getInfo 来创建函数指针。

    第二个问题是在thread 的构造函数中对getInfo 的调用需要一个额外的参数。除了显式的int a,由于getInfo 不是静态的,它需要一个隐式的Base* this。所以需要添加this。

    第三个最棘手的问题是Base 有两个getInfo 重载,因此您需要明确说明您想要哪一个。

    把这三样东西放在一起,你需要... 正是我打字时this answer 所说的。 :)

    【讨论】:

    • 我不明白为什么我必须添加 & 和 'this' 参数。在 cplusplus.com 上的线程文档中,使用 std::thread second (bar,0) 初始化线程; // 生成调用 bar(0) 的新线程。是因为我正在调用成员函数吗?如果是的话..为什么会这样?
    • 这样想:如果你没有传递this,编译器怎么知道你想在哪个Base对象上调用getInfo?当您使用o.getInfo(3) 之类的正常方式调用该函数时,很明显运算符左侧的对象应用作this。但是当您一般使用该函数时,您必须明确地为this 提供一个值。
    • 我之前的评论只解决了你的一半问题。回复另一半(&amp;),是的,不同的是你这里处理的是一个成员函数。
    • 我想我认为“this”是隐式的,因为成员函数是该名称在调用范围内可见的唯一函数。但这确实有道理,谢谢。
    • 好的;我明白为什么有人会这么认为。您是对的,理论上,如果您从C 的另一个成员函数中绑定到类C 的成员函数,则函数调用的this 值可能是用当前的this 隐式填充。但是为了实现thread、bind 和其他任何使用成员函数指针的东西,需要对语言进行某种实际的更改。无论如何,它不是那样工作的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    相关资源
    最近更新 更多