/boost/lockfree/queue.hpp:错误:静态断言失败:(的boost :: has_​​trivial_destructor< T> ::值) [英] /boost/lockfree/queue.hpp: error: static assertion failed: (boost::has_trivial_destructor<T>::value)

查看:1954
本文介绍了/boost/lockfree/queue.hpp:错误:静态断言失败:(的boost :: has_​​trivial_destructor< T> ::值)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在这个文件替换的boost :: lockfree ::队列的std ::队列 <一href=\"https://github.com/zaphoyd/websocketpp/blob/experimental/examples/broadcast_server/broadcast_server.cpp\" rel=\"nofollow\">https://github.com/zaphoyd/websocketpp/blob/experimental/examples/broadcast_server/broadcast_server.cpp

我已经添加了的#include&LT;升压/ lockfree / queue.hpp&GT; ;更改后的行 130 的std ::队列&LT;作用&gt; m_actions; ,到的boost :: lockfree ::队列&LT;作用&gt; m_actions; ;除去具有锁定做的所有行;并且更改后的行 103 m_actions.pop(); ,到 m_actions.pop(一);

我得到这些错误,当我 scons的broadcast_server_lockfree 在项目的根后添加 broadcast_server_lockfree = SConscript('#/ broadcast_server_lockfree / SConscript',variant_dir = builddir +'broadcast_server_lockfree',重复= 0)来项目的根的 SConstruct ,并使用 broadcast_server SConstruct broadcast_server_lockfree 目录:

 根@服务器:〜/ websocketpp-实验#scons的broadcast_server_lockfree
scons的:读SConscript文件...
C ++ 11的构建环境部分启用
scons的:读完SConscript文件。
scons的:建筑的目标...
scons的:建筑相关VariantDir目标:构建/发布/ broadcast_server_lockfree
G ++ -o建立/释放/​​ broadcast_server_lockfree / broadcast_server_lockfree.o -c -std =的C ++ 0x -Wall -Wcast对齐-isystem /根/ boost_1_53_0 -DNDEBUG -D_WEBSOCKETPP_CPP11_MEMORY_ -D_WEBSOCKETPP_CPP11_FUNCTIONAL_ -D_WEBSOCKETPP_CPP11_SYSTEM_ERROR_ -D_WEBSOCKETPP_CPP11_RANDOM_DEVICE_ -D_WEBSOCKETPP_NOEXCEPT_ -I。 broadcast_server_lockfree / broadcast_server_lockfree.cpp
10:0文件从broadcast_server_lockfree / broadcast_server_lockfree.cpp包括:
/root/boost_1_53_0/boost/lockfree/queue.hpp:在实例类boost :: lockfree ::队列&lt;作用&GT;':
broadcast_server_lockfree / broadcast_server_lockfree.cpp:139:36:从这里需要
/root/boost_1_53_0/boost/lockfree/queue.hpp:79:5:错误:静态断言失败:(的boost :: has_​​trivial_destructor&LT; T&GT; ::值)
/root/boost_1_53_0/boost/lockfree/queue.hpp:83:5:错误:静态断言失败:(的boost :: has_​​trivial_assign&LT; T&GT; ::值)
broadcast_server_lockfree / broadcast_server_lockfree.cpp:在成员函数'无效broadcast_server :: process_messages():
broadcast_server_lockfree / broadcast_server_lockfree.cpp:111:34:错误:'类boost :: lockfree ::队列&lt;作用&GT;'没有成员名为'前'
broadcast_server_lockfree / broadcast_server_lockfree.cpp:117:55:错误:'m_connection_lock在此范围未声明
broadcast_server_lockfree / broadcast_server_lockfree.cpp:120:55:错误:'m_connection_lock在此范围未声明
broadcast_server_lockfree / broadcast_server_lockfree.cpp:123:55:错误:'m_connection_lock在此范围未声明
10:0文件从broadcast_server_lockfree / broadcast_server_lockfree.cpp包括:
/root/boost_1_53_0/boost/lockfree/queue.hpp:在提振:: lockfree ::队列&LT的实例; T,A0,A1,A2&GT; ::〜队列()与T =动作; A0 =的boost ::参数:: void_; A1 =的boost ::参数:: void_; A2 =的boost ::参数:: void_]:
broadcast_server_lockfree / broadcast_server_lockfree.cpp:41:24:从这里需要
/root/boost_1_53_0/boost/lockfree/queue.hpp:229:11:错误:调用没有匹配的函数行动::行动()
/root/boost_1_53_0/boost/lockfree/queue.hpp:229:11:注意:考生:
broadcast_server_lockfree / broadcast_server_lockfree.cpp:32:5:注意:动作::动作(ACTION_TYPE,websocketpp ::端点&LT; websocketpp ::连接&LT; websocketpp ::配置:: ASIO&gt;中websocketpp ::配置:: ASIO&GT; :: message_ptr)
broadcast_server_lockfree / broadcast_server_lockfree.cpp:32:5:注意:考生预计2个参数,提供0
broadcast_server_lockfree / broadcast_server_lockfree.cpp:31:5:注意:动作::动作(ACTION_TYPE,websocketpp :: connection_hdl)
broadcast_server_lockfree / broadcast_server_lockfree.cpp:31:5:注意:考生预计2个参数,提供0
broadcast_server_lockfree / broadcast_server_lockfree.cpp:30:8:注意:动作::动作(const的行动和放大器;)
broadcast_server_lockfree / broadcast_server_lockfree.cpp:30:8:注意:考生预计1参数,提供0
10:0文件从broadcast_server_lockfree / broadcast_server_lockfree.cpp包括:
/root/boost_1_53_0/boost/lockfree/queue.hpp:在实例化的boost :: lockfree ::队列&LT; T,A0,A1,A2&GT; ::节点::节点(升压:: lockfree ::队列&LT; T, A0,A1,A2&GT; ::节点:: handle_type)与T =动作; A0 =的boost ::参数:: void_; A1 =的boost ::参数:: void_; A2 =的boost ::参数:: void_;提高:: lockfree ::队列&LT; T,A0,A1,A2&GT; ::节点:: handle_type =提振:: lockfree ::队列&LT;作用&gt; ::节点*]:
/root/boost_1_53_0/boost/lockfree/detail/freelist.hpp:82:13:从'要求T *的boost :: lockfree ::详细:: freelist_stack LT&; T,和的Alloc GT; ::结构(常量ArgumentType&安培;)与布尔ThreadSafe的= TRUE;布尔界= FALSE; ArgumentType =提振:: lockfree ::队列&LT;作用&gt; ::节点。*; T =的boost :: lockfree ::队列&LT;作用&gt; ::节点; ALLOC =的std ::分配器&LT;提高:: lockfree ::队列&LT;作用&gt; ::节点&GT;]
/root/boost_1_53_0/boost/lockfree/queue.hpp:126:75:从'无效升压所需:: lockfree ::队列&LT; T,A0,A1,A2&GT; ::初始化()与T =动作; A0 =的boost ::参数:: void_; A1 =的boost ::参数:: void_; A2 =的boost ::参数:: void_]'
/root/boost_1_53_0/boost/lockfree/queue.hpp:166:9:从'升压所需:: lockfree ::队列&LT; T,A0,A1,A2&GT; ::队列()与T =动作; A0 =的boost ::参数:: void_; A1 =的boost ::参数:: void_; A2 =的boost ::参数:: void_]'
broadcast_server_lockfree / broadcast_server_lockfree.cpp:41:24:从这里需要
/root/boost_1_53_0/boost/lockfree/queue.hpp:109:52:错误:调用没有匹配的函数行动::行动()
/root/boost_1_53_0/boost/lockfree/queue.hpp:109:52:注意:考生:
broadcast_server_lockfree / broadcast_server_lockfree.cpp:32:5:注意:动作::动作(ACTION_TYPE,websocketpp ::端点&LT; websocketpp ::连接&LT; websocketpp ::配置:: ASIO&gt;中websocketpp ::配置:: ASIO&GT; :: message_ptr)
broadcast_server_lockfree / broadcast_server_lockfree.cpp:32:5:注意:考生预计2个参数,提供0
broadcast_server_lockfree / broadcast_server_lockfree.cpp:31:5:注意:动作::动作(ACTION_TYPE,websocketpp :: connection_hdl)
broadcast_server_lockfree / broadcast_server_lockfree.cpp:31:5:注意:考生预计2个参数,提供0
broadcast_server_lockfree / broadcast_server_lockfree.cpp:30:8:注意:动作::动作(const的行动和放大器;)
broadcast_server_lockfree / broadcast_server_lockfree.cpp:30:8:注意:考生预计1参数,提供0
scons的:*** [建立/释放/​​ broadcast_server_lockfree / broadcast_server_lockfree.o]错误1
scons的:建筑终止,因为错误的。

我知道旁边没有关​​于C ++和对错误的搜索已经产生了什么(因为我不知道我在读什么)。

这里的的boost :: lockfree ::队列例如,如果它帮助。 http://boost-sandbox.sourceforge.net/doc/html/lockfree /examples.html

请告诉我如何纠正这一点。

动作

 结构动作{
    行动(ACTION_TYPE T,connection_hdl H):类型(T),高密度脂蛋白(H){}
    行动(ACTION_TYPE T,服务器:: message_ptr M):类型(T),味精(M){}    ACTION_TYPE类型;
    websocketpp :: connection_hdl HDL;
    服务器:: message_ptr味精;
};


解决方案

文档

T必须有一个拷贝构造函数,一个微不足道的赋值运算符和析构函数琐碎

因此​​,你的动作类必须如下所示:

 集体诉讼
{
上市:
    行动(const的行动和放大器; RHS){...}
    //隐式定义的析构函数自身和所有成员变量
    //隐式定义的操作符=自身和所有成员变量};

static_assert s的抱怨,因为你的析构函数和运算符= 都不会隐编译器定义(或本是的行动至少有一个成员变量的情况下)。

编辑:我有一个快速浏览一下回购 - 我似乎无法找到 connection_hdl ,并没有 message_ptr 模板&LT; typename的终点&GT;级服务器。无论哪种方式, websocketpp之一:: connection_hdl HDL 服务器:: message_ptr味精不满足上述条件。只是掉入一lockfree队列,而不是使用的std ::队列可能是一个不平凡的任务,这将需要一些改动。

I'm trying to substitute boost::lockfree::queue for std::queue in this file https://github.com/zaphoyd/websocketpp/blob/experimental/examples/broadcast_server/broadcast_server.cpp

I've added #include <boost/lockfree/queue.hpp>; changed line 130, std::queue<action> m_actions;, to boost::lockfree::queue<action> m_actions;; removed all lines having to do with locking; and changed line 103, m_actions.pop();, to m_actions.pop(a);.

I get these errors when I scons broadcast_server_lockfree in the project root after adding broadcast_server_lockfree = SConscript('#/broadcast_server_lockfree/SConscript',variant_dir = builddir + 'broadcast_server_lockfree',duplicate = 0) to the project root's SConstruct and using broadcast_server's SConstruct in the broadcast_server_lockfree directory:

root@server:~/websocketpp-experimental# scons broadcast_server_lockfree
scons: Reading SConscript files ...
C++11 build environment partially enabled
scons: done reading SConscript files.
scons: Building targets ...
scons: building associated VariantDir targets: build/release/broadcast_server_lockfree
g++ -o build/release/broadcast_server_lockfree/broadcast_server_lockfree.o -c -std=c++0x -Wall -Wcast-align -isystem /root/boost_1_53_0 -DNDEBUG -D_WEBSOCKETPP_CPP11_MEMORY_ -D_WEBSOCKETPP_CPP11_FUNCTIONAL_ -D_WEBSOCKETPP_CPP11_SYSTEM_ERROR_ -D_WEBSOCKETPP_CPP11_RANDOM_DEVICE_ -D_WEBSOCKETPP_NOEXCEPT_ -I. broadcast_server_lockfree/broadcast_server_lockfree.cpp
In file included from broadcast_server_lockfree/broadcast_server_lockfree.cpp:10:0:
/root/boost_1_53_0/boost/lockfree/queue.hpp: In instantiation of 'class boost::lockfree::queue<action>':
broadcast_server_lockfree/broadcast_server_lockfree.cpp:139:36:   required from here
/root/boost_1_53_0/boost/lockfree/queue.hpp:79:5: error: static assertion failed: (boost::has_trivial_destructor<T>::value)
/root/boost_1_53_0/boost/lockfree/queue.hpp:83:5: error: static assertion failed: (boost::has_trivial_assign<T>::value)
broadcast_server_lockfree/broadcast_server_lockfree.cpp: In member function 'void broadcast_server::process_messages()':
broadcast_server_lockfree/broadcast_server_lockfree.cpp:111:34: error: 'class boost::lockfree::queue<action>' has no member named 'front'
broadcast_server_lockfree/broadcast_server_lockfree.cpp:117:55: error: 'm_connection_lock' was not declared in this scope
broadcast_server_lockfree/broadcast_server_lockfree.cpp:120:55: error: 'm_connection_lock' was not declared in this scope
broadcast_server_lockfree/broadcast_server_lockfree.cpp:123:55: error: 'm_connection_lock' was not declared in this scope
In file included from broadcast_server_lockfree/broadcast_server_lockfree.cpp:10:0:
/root/boost_1_53_0/boost/lockfree/queue.hpp: In instantiation of 'boost::lockfree::queue<T, A0, A1, A2>::~queue() [with T = action; A0 = boost::parameter::void_; A1 = boost::parameter::void_; A2 = boost::parameter::void_]':
broadcast_server_lockfree/broadcast_server_lockfree.cpp:41:24:   required from here
/root/boost_1_53_0/boost/lockfree/queue.hpp:229:11: error: no matching function for call to 'action::action()'
/root/boost_1_53_0/boost/lockfree/queue.hpp:229:11: note: candidates are:
broadcast_server_lockfree/broadcast_server_lockfree.cpp:32:5: note: action::action(action_type, websocketpp::endpoint<websocketpp::connection<websocketpp::config::asio>, websocketpp::config::asio>::message_ptr)
broadcast_server_lockfree/broadcast_server_lockfree.cpp:32:5: note:   candidate expects 2 arguments, 0 provided
broadcast_server_lockfree/broadcast_server_lockfree.cpp:31:5: note: action::action(action_type, websocketpp::connection_hdl)
broadcast_server_lockfree/broadcast_server_lockfree.cpp:31:5: note:   candidate expects 2 arguments, 0 provided
broadcast_server_lockfree/broadcast_server_lockfree.cpp:30:8: note: action::action(const action&)
broadcast_server_lockfree/broadcast_server_lockfree.cpp:30:8: note:   candidate expects 1 argument, 0 provided
In file included from broadcast_server_lockfree/broadcast_server_lockfree.cpp:10:0:
/root/boost_1_53_0/boost/lockfree/queue.hpp: In instantiation of 'boost::lockfree::queue<T, A0, A1, A2>::node::node(boost::lockfree::queue<T, A0, A1, A2>::node::handle_type) [with T = action; A0 = boost::parameter::void_; A1 = boost::parameter::void_; A2 = boost::parameter::void_; boost::lockfree::queue<T, A0, A1, A2>::node::handle_type = boost::lockfree::queue<action>::node*]':
/root/boost_1_53_0/boost/lockfree/detail/freelist.hpp:82:13:   required from 'T* boost::lockfree::detail::freelist_stack<T, Alloc>::construct(const ArgumentType&) [with bool ThreadSafe = true; bool Bounded = false; ArgumentType = boost::lockfree::queue<action>::node*; T = boost::lockfree::queue<action>::node; Alloc = std::allocator<boost::lockfree::queue<action>::node>]'
/root/boost_1_53_0/boost/lockfree/queue.hpp:126:75:   required from 'void boost::lockfree::queue<T, A0, A1, A2>::initialize() [with T = action; A0 = boost::parameter::void_; A1 = boost::parameter::void_; A2 = boost::parameter::void_]'
/root/boost_1_53_0/boost/lockfree/queue.hpp:166:9:   required from 'boost::lockfree::queue<T, A0, A1, A2>::queue() [with T = action; A0 = boost::parameter::void_; A1 = boost::parameter::void_; A2 = boost::parameter::void_]'
broadcast_server_lockfree/broadcast_server_lockfree.cpp:41:24:   required from here
/root/boost_1_53_0/boost/lockfree/queue.hpp:109:52: error: no matching function for call to 'action::action()'
/root/boost_1_53_0/boost/lockfree/queue.hpp:109:52: note: candidates are:
broadcast_server_lockfree/broadcast_server_lockfree.cpp:32:5: note: action::action(action_type, websocketpp::endpoint<websocketpp::connection<websocketpp::config::asio>, websocketpp::config::asio>::message_ptr)
broadcast_server_lockfree/broadcast_server_lockfree.cpp:32:5: note:   candidate expects 2 arguments, 0 provided
broadcast_server_lockfree/broadcast_server_lockfree.cpp:31:5: note: action::action(action_type, websocketpp::connection_hdl)
broadcast_server_lockfree/broadcast_server_lockfree.cpp:31:5: note:   candidate expects 2 arguments, 0 provided
broadcast_server_lockfree/broadcast_server_lockfree.cpp:30:8: note: action::action(const action&)
broadcast_server_lockfree/broadcast_server_lockfree.cpp:30:8: note:   candidate expects 1 argument, 0 provided
scons: *** [build/release/broadcast_server_lockfree/broadcast_server_lockfree.o] Error 1
scons: building terminated because of errors.

I know next to nothing about c++, and searches on the error have yielded nothing (since I have no idea what I'm reading).

Here's the boost::lockfree::queue example if it helps. http://boost-sandbox.sourceforge.net/doc/html/lockfree/examples.html

Please show me how to correct this.

action

struct action {
    action(action_type t, connection_hdl h) : type(t), hdl(h) {}
    action(action_type t, server::message_ptr m) : type(t), msg(m) {}

    action_type type;
    websocketpp::connection_hdl hdl;
    server::message_ptr msg;
};

解决方案

From the docs:

T must have a copy constructor, a trivial assignment operator, and a trivial destructor.

Thus your action class must look like the following:

class action
{
public:
    action(const action& rhs) { ... }
    //Implicitly defined destructor for itself and all member variables
    //Implicitly defined operator= for itself and all member variables

};

The static_asserts are complaining because your destructor and operator= are not implicitly defined by the compiler (or this is the case for at least one member variable of action).

Edit: I've had a quick look at the repo - I can't seem to find connection_hdl, and there is no message_ptr in template <typename endpoint> class server. Either way, one of websocketpp::connection_hdl hdl or server::message_ptr msg does not satisfy the above conditions. Just "dropping in" a lockfree queue instead of using a std::queue is likely a non-trivial task which will require a number of changes.

这篇关于/boost/lockfree/queue.hpp:错误:静态断言失败:(的boost :: has_​​trivial_destructor&LT; T&GT; ::值)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆