首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >/boost/lockfree/Quee.hpp: error:静态断言失败:(boost::has_trivial_destructor<T>::value)

/boost/lockfree/Quee.hpp: error:静态断言失败:(boost::has_trivial_destructor<T>::value)
EN

Stack Overflow用户
提问于 2013-03-18 01:07:23
回答 3查看 7.6K关注 0票数 5

我试图在这个文件中用boost::lockfree::queue代替std::queueserver.cpp

我添加了#include <boost/lockfree/queue.hpp>;将行130std::queue<action> m_actions;更改为boost::lockfree::queue<action> m_actions;;删除了与锁定相关的所有行;并将行103m_actions.pop();更改为m_actions.pop(a);

在将scons broadcast_server_lockfree添加到项目根的SConstruct并在broadcast_server_lockfree目录中使用broadcast_serverSConstruct后,当我在项目根目录中使用broadcast_serverSConstruct时,会得到以下错误:

代码语言:javascript
运行
复制
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.

我对c++几乎一无所知,对错误的搜索没有任何结果(因为我不知道我在读什么)。

下面是boost::lockfree::queue示例,如果有帮助的话。http://boost-sandbox.sourceforge.net/doc/html/lockfree/examples.html

请教我怎么纠正这个问题。

action

代码语言:javascript
运行
复制
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;
};
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-18 01:13:45

来自文档

T必须有一个复制构造函数、一个普通赋值操作符和一个普通析构函数。

因此,您的action类必须如下所示:

代码语言:javascript
运行
复制
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

};

static_assert正在抱怨,因为您的析构函数和operator=不是编译器隐式定义的(或者至少有一个action成员变量是这样的)。

编辑:我快速查看了回购程序--我似乎找不到connection_hdl,而且template <typename endpoint> class server中也没有message_ptr。无论哪种方式,websocketpp::connection_hdl hdlserver::message_ptr msg之一都不满足上述条件。仅仅“放入”一个没有锁的队列,而不是使用一个std::queue,这可能是一项非常重要的任务,需要进行大量的更改。

票数 9
EN

Stack Overflow用户

发布于 2019-03-29 21:04:09

这一问题在上述帖子中得到了很好的回答。在这里,我将提供更多的例子。富有成效的讨论给了我们很多指导,请大家阅读。真正的问题是对队列模板类型的需求。为了实用,让我们来看看一些实际的用例。

代码语言:javascript
运行
复制
namespace lkf=boost::lockfree;
vector<lkf::spsc_queue<pair<Fastq*,int>, lkf::capacity<100>>> datastore;
//lkf::queue<pair<char*,char*>, lkf::capacity<100>> pile1, pile2;  //failed assert
lkf::queue<pair<char*,char*>*, lkf::capacity<100>> pile1, pile2;

代码中的第一行传递了编译器(因为它是spac_queue),但是第二行对失败了编译器(原因是boost::ASSERT):

代码语言:javascript
运行
复制
/usr/local/include/boost/lockfree/queue.hpp:99:5: error: static assertion failed: (boost::has_trivial_assign<T>::value)
     BOOST_STATIC_ASSERT((boost::has_trivial_assign<T>::value));

将对转换为指针类型(第3行)之后,编译器就会很高兴了。

是否需要更新boost断言?转换为指针是一个快速的技巧,可能不是最好的。

boost无锁::队列有三个要求

  1. T必须有一个副本构造函数。
  2. T必须有一个平凡的赋值运算符。
  3. T必须有一个平凡的析构函数。

spsc_queue有两个:

  1. T必须具有默认构造函数。
  2. T必须是可复制的
票数 1
EN

Stack Overflow用户

发布于 2020-11-24 10:36:38

当我对队列项类型使用std::string时,我得到了这个错误。

boost::lockfree::queue<string>(10000)

正如许多优秀的人在答案这里这里中指出的那样,boost::lockfree::queue不允许使用字符串。

它是用char *编译的

boost::lockfree::queue<char*>(10000)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15468278

复制
相关文章

相似问题

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