std::线程初始化构造函数给出编译错误

std::thread initialization constructor gives compile error

本文关键字:编译 错误 构造函数 线程 初始化 std      更新时间:2023-10-16

我正在研究一个Visual Studio项目(v120编译器),该项目使用std::thread从usb设备读取GUI之外的内容,该函数抛出错误:"错误C2661'std::hread::thread':没有重载函数需要3个参数"

这是代码:

class IOThread
{
public:
IOThread(DeviceHandler *handle) : _handle(handle)
~IOThread();
std::thread *getThread(ThreadType type);
template <typename T>
void execRead(std::list<T> *dataStack)
{
    std::thread *thread = getThread(Read);
    if (thread == NULL)
    {
        thread = new std::thread(&DeviceHandler::readFromBus, _handle, dataStack);
        _threadPool.push_back(std::make_pair(Read, thread));
    }
}
private:
DeviceHandler                                       *_handle;
std::vector<std::pair<ThreadType, std::thread *>>   _threadPool;
};

此外,DeviceHandler是一个抽象类,它定义了纯虚拟readFromBus函数,其原型是以下

template <typename T>
void readFromBus(std::list<T> *dataStack) = 0;

我希望你在解决这个烂摊子时不要像我一样头疼。。。问候,

正如评论中所解释的,您的情况与此问题相同。因为方法DeviceHandler::readFromBus()是任意模板化的,所以可以生成许多重载。(他们的名字相同,但签名不同)。

因此,编译器无法选择正确的重载,因此出现错误消息。您需要告诉编译器强制转换要使用哪个重载。(正如这个答案所解释的)

以下演员阵容应该做到:

thread = new std::thread(
     static_cast<void (DeviceHandler::*)(std::list<T> *)>(&DeviceHandler::readFromBus),
     _handle, dataStack);

我试图给出错误的MVCE,但我无法测试它是否编译;但下面是使用您的铸造的类的实际结构

thread = new std::thread(
 static_cast<void (DeviceHandler::*)(std::list<T> *)>(&DeviceHandler::readFromBus),
 _handle, dataStack);

http://ideone.com/gVh1Du

编辑:我解决了这个问题,问题是模板化的纯定义,我用一个函数取代了它,该函数接收参数,一个抽象结构,如下所示

typedef struct s_dataStack
{
  DataType type;
  std::list<void *> stack;
} t_dataStack;

然后,我将提供类型的任何堆栈元素强制转换为enum"datatype"。无论如何,感谢你的帮助,这让我找到了问题的根源。