这个关于C ++ 11中使用g ++的互斥锁的编译错误是什么?

时间:2014-05-07 15:29:57

标签: c++ c++11 g++ mutex

这个c ++编译错误是什么?我已经在另一个已配置的机器上编译了我的代码,所以我想我在环境中错过了用C ++ 11编译的代码(代码用--std = c ++ 0x选项编译)。该错误似乎与C ++ 11中的新互斥功能有关。

In file included from /usr/include/c++/4.6/mutex:43:0,
                 from include/Ric_box_tele.h:4,
                 from src/Ric_box_tele.cpp:1:
/usr/include/c++/4.6/functional: In member function ‘void std::_Bind_result<_Result, _Functor(_Bound_args ...)>::__call(std::tuple<_Args ...>&&, std::_Index_tuple<_Indexes ...>, typename std::_Bind_result<_Result, _Functor(_Bound_args ...)>::__enable_if_void<_Res>::type) [with _Res = void, _Args = {}, int ..._Indexes = {0, 1, 2}, _Result = void, _Functor = std::_Mem_fn<void (Ric_box_tele::*)(Socket, int)>, _Bound_args = {Ric_box_tele*, Socket, int}, typename std::_Bind_result<_Result, _Functor(_Bound_args ...)>::__enable_if_void<_Res>::type = int]’:
/usr/include/c++/4.6/functional:1378:24:   instantiated from ‘std::_Bind_result<_Result, _Functor(_Bound_args ...)>::result_type std::_Bind_result<_Result, _Functor(_Bound_args ...)>::operator()(_Args&& ...) [with _Args = {}, _Result = void, _Functor = std::_Mem_fn<void (Ric_box_tele::*)(Socket, int)>, _Bound_args = {Ric_box_tele*, Socket, int}, std::_Bind_result<_Result, _Functor(_Bound_args ...)>::result_type = void]’
/usr/include/c++/4.6/thread:117:13:   instantiated from ‘void std::thread::_Impl<_Callable>::_M_run() [with _Callable = std::_Bind_result<void, std::_Mem_fn<void (Ric_box_tele::*)(Socket, int)>(Ric_box_tele*, Socket, int)>]’
src/Ric_box_tele.cpp:453:1:   instantiated from here
/usr/include/c++/4.6/functional:1287:4: error: use of deleted function ‘Socket::Socket(const Socket&)’
include/Socket.h:43:5: error: declared here
/usr/include/c++/4.6/functional:550:7: error:   initializing argument 2 of ‘_Res std::_Mem_fn<_Res (_Class::*)(_ArgTypes ...)>::operator()(_Class*, _ArgTypes ...) const [with _Res = void, _Class = Ric_box_tele, _ArgTypes = {Socket, int}]’

3 个答案:

答案 0 :(得分:4)

Ric_box_tele中有一个方法,它按值Socket变量(签名似乎是void method(Socket, int) - 我不知道函数的名称是什么,就像你一样未能包含产生错误的代码行。)

无法复制

Socket个变量(删除其复制构造函数)。

错误与文件src/Ric_box_tele.cpp的第453行有关,但您未能在问题中添加该错误。在那一行,你创建了一个std::thread,可能会传递一个套接字,也许是aforsaid方法和指向该对象的指针。

Bind错误可能来自std::thread获取n元成员函数指针并自动将它们转换为n + 1-ary callables的能力,并在实现细节中实现(可能{{1}或等效的内部机制)。它只会给核心错误消息增加噪音。

通常,在解码C ++库错误时,您需要查看提及的自己的代码的哪一行,然后您要查看最里面的错误。

最里面的错误是std::bind,而您自己的代码的行是&#34;文件的第453行use of deleted function ‘Socket::Socket(const Socket&)’&#34;。其他所有内容都可以帮助您了解两者如何相互连接。

答案 1 :(得分:1)

实际上我认为互斥包含的是红鲱鱼。相反,您似乎正在尝试复制Socket src/Ric_box_tele.cpp:453导致错误,因为Socket是不可复制的。

答案 2 :(得分:0)

错误是由于g ++的版本(4.6而不是4.7)。我想较旧的那个没有实现我使用的一个C ++ 11特性,因此该行之后的代码没有被正确解释。