首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用抽象类成员c++创建线程时出现元组错误C2661

使用抽象类成员c++创建线程时出现元组错误C2661
EN

Stack Overflow用户
提问于 2020-04-18 05:00:09
回答 1查看 297关注 0票数 0

错误元组:‘std::C2661::tuple’:没有重载函数接受3个参数

我创建了一个名为DataManager的抽象类,它有一个纯虚函数close(ClientData b) =0;

代码语言:javascript
复制
ifndef _DataManager_HPP_
#define _DataManager_HPP_
#include <string>
#include "../ClientBlockData.hpp"


namespace slssm {

enum COMMAND_TYPE { DB_WRITE = 0, DB_READ, DB_NONE };
class DataManager {
  public:

    virtual std::vector<std::string> Update(ClientBlockData& blkData,
                                            std::string& iQuery) = 0;

    virtual void closeDb(ClientBlockData& blkData) = 0;

    virtual std::string buildDbQuery(std::string& iTableName,
                                     std::string& msg,
                                     std::string& oTopic,
                                     COMMAND_TYPE& oCmdType) = 0;
   // ~DataManager() {}
};

它作为SQLiteManager.hpp中的一个派生类SQLiteManager

代码语言:javascript
复制
void closeDb(ClientBlockData& blkData) {
mDb=nullptr;
}

在main函数中,我像这样使用它

代码语言:javascript
复制
SQLiteManager* dbmang = new SQLiteManager(blkData.mDb, mTableName, iSSMLoggingFlag, qcc);

// Spawn a new listener thread that responds to queries
mQueryHandlerThreads[blkData.mLocalId] =
    std::thread(&SQLiteManager::closeDb, dbmang,
                blkData); 

报告的错误

代码语言:javascript
复制
c:\program files (x86)\microsoft visual studio\2017\professional\vc\tools\msvc\14.15.26726\include\memory(2539,1): error C2661:  'std::tuple<void (__cdecl slssm::SQLiteManager::* )(slssm::ClientBlockData &),slssm::SQLiteManager *,slssm::ClientBlockData>::tuple': no overloaded function takes 3 arguments
1>c:\program files (x86)\microsoft visual studio\2017\professional\vc\tools\msvc\14.15.26726\include\thread(49): message :  see reference to function template instantiation 'std::unique_ptr<std::tuple<void (__cdecl slssm::SQLiteManager::* )(slssm::ClientBlockData &),slssm::SQLiteManager *,slssm::ClientBlockData>,std::default_delete<_Ty>> std::make_unique<std::tuple<void (__cdecl slssm::SQLiteManager::* )(slssm::ClientBlockData &),slssm::SQLiteManager *,slssm::ClientBlockData>,void(__cdecl slssm::SQLiteManager::* )(slssm::ClientBlockData &),slssm::SQLiteManager*&,slssm::ClientBlockData&,0>(void (__cdecl slssm::SQLiteManager::* &&)(slssm::ClientBlockData &),slssm::SQLiteManager *&,slssm::ClientBlockData &)' being compiled
1>c:\program files (x86)\microsoft visual studio\2017\professional\vc\tools\msvc\14.15.26726\include\thread(49): message :         with
1>c:\program files (x86)\microsoft visual studio\2017\professional\vc\tools\msvc\14.15.26726\include\thread(49): message :         [
1>c:\program files (x86)\microsoft visual studio\2017\professional\vc\tools\msvc\14.15.26726\include\thread(49): message :             _Ty=std::tuple<void (__cdecl slssm::SQLiteManager::* )(slssm::ClientBlockData &),slssm::SQLiteManager *,slssm::ClientBlockData>
1>c:\program files (x86)\microsoft visual studio\2017\professional\vc\tools\msvc\14.15.26726\include\thread(49): message :         ]
EN

回答 1

Stack Overflow用户

发布于 2020-11-19 15:19:45

您必须使用对blkData的引用

代码语言:javascript
复制
   mQueryHandlerThreads[blkData.mLocalId] =
        std::thread(&SQLiteManager::closeDb, dbmang,
                    std::ref(blkData)); 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61280580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档