尝试在类构造函数中初始化 std::thread 时,函数中的编译器错误 C2064
Compiler error C2064 in functional when try to initialise a std::thread in a class constructor
我正在编写一个使用线程的类,我想尝试新的 C++11std::thread
。 我正在使用Microsoft Visual Studio Pro 2013 v12.0.31101.00 Update 4进行编译。更新从 2014 年 11 月开始,因此是相当最新的。 我可以将std::thread
用于简单用途,但在下面的代码中,我收到编译器错误。
如果我注释掉线程的初始化,如下所示:
serial(int port) : port_(port) {} //, reader_thread(&serial::reader_thread_func) {}
然后它编译正常。
我该如何解决这个问题?
这是我的代码。
串行.hpp:
/* serial port class */
#ifndef SERIAL_
#define SERIAL_
#include <thread>
class serial
{
public:
serial(int port) : port_(port), reader_thread(&serial::reader_thread_func) {}
~serial();
bool open();
bool close();
private:
std::thread reader_thread;
void reader_thread_func();
int port_;
};
#endif // SERIAL_
序列号.cpp:
#include <iostream>
#include "serial.hpp"
void serial::reader_thread_func() {
std::cout << "reader thread running with thread id: " << std::this_thread::get_id() << 'n';
}
serial::~serial() {
close();
}
bool serial::open() {
close(); // in case we are already open
std::cout << "opening port " << port_ << 'n';
return true;
}
bool serial::close() {
std::cout << "closing port " << port_ << 'n';
return false;
}
主要.cpp驱动:
#include "serial.hpp"
int main() {
serial s(3);
s.open();
s.close();
}
编译器错误:
1>------ Build started: Project: thread_in_class, Configuration: Debug Win32 ------
1> serial.cpp
1>c:program files (x86)microsoft visual studio 12.0vcincludefunctional(1149): error C2064: term does not evaluate to a function taking 0 arguments
1> class does not define an 'operator()' or a user defined conversion operator to a pointer-to-function or reference-to-function that takes appropriate number of arguments
1> c:program files (x86)microsoft visual studio 12.0vcincludefunctional(1137) : see reference to function template instantiation 'void std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall serial::* )(void),void,serial,>,>::_Do_call<,>(std::tuple<>,std::_Arg_idx<>)' being compiled
1> c:program files (x86)microsoft visual studio 12.0vcincludefunctional(1137) : see reference to function template instantiation 'void std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall serial::* )(void),void,serial,>,>::_Do_call<,>(std::tuple<>,std::_Arg_idx<>)' being compiled
1> c:program files (x86)microsoft visual studio 12.0vcincludethrxthread(195) : see reference to function template instantiation 'void std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall serial::* )(void),void,serial,>,>::operator ()<>(void)' being compiled
1> c:program files (x86)microsoft visual studio 12.0vcincludethrxthread(195) : see reference to function template instantiation 'void std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall serial::* )(void),void,serial,>,>::operator ()<>(void)' being compiled
1> c:program files (x86)microsoft visual studio 12.0vcincludethrxthread(192) : while compiling class template member function 'unsigned int std::_LaunchPad<_Target>::_Run(std::_LaunchPad<_Target> *)'
1> with
1> [
1> _Target=std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall serial::* )(void),void,serial,>,>
1> ]
1> c:program files (x86)microsoft visual studio 12.0vcincludethrxthread(187) : see reference to function template instantiation 'unsigned int std::_LaunchPad<_Target>::_Run(std::_LaunchPad<_Target> *)' being compiled
1> with
1> [
1> _Target=std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall serial::* )(void),void,serial,>,>
1> ]
1> c:program files (x86)microsoft visual studio 12.0vcincludethrxthread(205) : see reference to class template instantiation 'std::_LaunchPad<_Target>' being compiled
1> with
1> [
1> _Target=std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall serial::* )(void),void,serial,>,>
1> ]
1> c:program files (x86)microsoft visual studio 12.0vcincludethread(49) : see reference to function template instantiation 'void std::_Launch<std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall serial::* )(void),void,serial,>,>>(_Thrd_t *,_Target &&)' being compiled
1> with
1> [
1> _Target=std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall serial::* )(void),void,serial,>,>
1> ]
1> c:usersangusdocumentsvisual studio 2013projectsthread_in_classthread_in_classserial.hpp(10) : see reference to function template instantiation 'std::thread::thread<void(__thiscall serial::* )(void),>(_Fn &&)' being compiled
1> with
1> [
1> _Fn=void (__thiscall serial::* )(void)
1> ]
1> main.cpp
1>c:program files (x86)microsoft visual studio 12.0vcincludefunctional(1149): error C2064: term does not evaluate to a function taking 0 arguments
1> class does not define an 'operator()' or a user defined conversion operator to a pointer-to-function or reference-to-function that takes appropriate number of arguments
1> c:program files (x86)microsoft visual studio 12.0vcincludefunctional(1137) : see reference to function template instantiation 'void std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall serial::* )(void),void,serial,>,>::_Do_call<,>(std::tuple<>,std::_Arg_idx<>)' being compiled
1> c:program files (x86)microsoft visual studio 12.0vcincludefunctional(1137) : see reference to function template instantiation 'void std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall serial::* )(void),void,serial,>,>::_Do_call<,>(std::tuple<>,std::_Arg_idx<>)' being compiled
1> c:program files (x86)microsoft visual studio 12.0vcincludethrxthread(195) : see reference to function template instantiation 'void std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall serial::* )(void),void,serial,>,>::operator ()<>(void)' being compiled
1> c:program files (x86)microsoft visual studio 12.0vcincludethrxthread(195) : see reference to function template instantiation 'void std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall serial::* )(void),void,serial,>,>::operator ()<>(void)' being compiled
1> c:program files (x86)microsoft visual studio 12.0vcincludethrxthread(192) : while compiling class template member function 'unsigned int std::_LaunchPad<_Target>::_Run(std::_LaunchPad<_Target> *)'
1> with
1> [
1> _Target=std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall serial::* )(void),void,serial,>,>
1> ]
1> c:program files (x86)microsoft visual studio 12.0vcincludethrxthread(187) : see reference to function template instantiation 'unsigned int std::_LaunchPad<_Target>::_Run(std::_LaunchPad<_Target> *)' being compiled
1> with
1> [
1> _Target=std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall serial::* )(void),void,serial,>,>
1> ]
1> c:program files (x86)microsoft visual studio 12.0vcincludethrxthread(205) : see reference to class template instantiation 'std::_LaunchPad<_Target>' being compiled
1> with
1> [
1> _Target=std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall serial::* )(void),void,serial,>,>
1> ]
1> c:program files (x86)microsoft visual studio 12.0vcincludethread(49) : see reference to function template instantiation 'void std::_Launch<std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall serial::* )(void),void,serial,>,>>(_Thrd_t *,_Target &&)' being compiled
1> with
1> [
1> _Target=std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall serial::* )(void),void,serial,>,>
1> ]
1> c:usersangusdocumentsvisual studio 2013projectsthread_in_classthread_in_classserial.hpp(10) : see reference to function template instantiation 'std::thread::thread<void(__thiscall serial::* )(void),>(_Fn &&)' being compiled
1> with
1> [
1> _Fn=void (__thiscall serial::* )(void)
1> ]
1> Generating Code...
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
reader_thread_func
是一个类成员函数。它不能作为独立函数调用,只能在类serial
的实例上调用。您需要提供serial
的实例作为第一个参数thread
:
reader_thread = std::thread(&serial::reader_thread_func, this);
// ↑↑↑↑
这就是错误"术语不计算为采用 0 个参数的函数"的含义 - 在INVOKE的上下文中,reader_thread_func
接受一个参数:serial
。
相关文章:
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 我需要知道编译器如何在cpp中使用析构函数
- 编译器如何区分std::vector的构造函数
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 编译器如何在使用SFINAE的函数和标准函数之间确定两者是否可行
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 填充上编译器生成的复制构造函数之间的不一致
- 编译器找不到'aligned_alloc'函数
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- 为什么编译器将其解析为函数指针而不是递归调用?
- 表达式未评估为常数两个级别的constexpr函数(编译器错误?)
- 从 std::streambif 继承时不兼容析构函数编译器警告
- 在构造函数 - 编译器错误中调用的成员变量的驱动器
- 复制初始化和显式构造函数-编译器的差异
- 静态函数编译器优化C++
- 为什么派生类虚函数可以调用基类虚函数?编译器如何实现
- 复制构造函数 - 编译器错误 C2040 和 C2440
- 带有模板返回类型的虚基函数:编译器在使用pointtype作为模板参数的派生类时失败(MSVC 2013)
- C++中虚拟函数编译器的作用