C++ 调试websocket++;broadcast_server.cpp(';owner#u less';不是';std';的成员)

C++ 调试websocket++;broadcast_server.cpp(';owner#u less';不是';std';的成员),c++,compiler-errors,std,member,websocket++,C++,Compiler Errors,Std,Member,Websocket++,Zaphoyd的broadcast_server.cpp看起来像是websocket服务器的完美主干,它可以通过线程快速接收和发送消息和连接,从而实现真正的操作,从而不会中断通信 他的简单的print_server.cpp示例编译起来很容易;但是,我在使用broadcast\u server.cpp时遇到了一些编译错误 root@server:~# g++ -O3 broadcast_server.cpp -I ~/websocketpp-experimental/ -lboost_system

Zaphoyd的
broadcast_server.cpp
看起来像是websocket服务器的完美主干,它可以通过线程快速接收和发送消息和连接,从而实现真正的操作,从而不会中断通信

他的简单的
print_server.cpp
示例编译起来很容易;但是,我在使用
broadcast\u server.cpp
时遇到了一些编译错误

root@server:~# g++ -O3 broadcast_server.cpp -I ~/websocketpp-experimental/ -lboost_system
broadcast_server.cpp:126:37: error: 'owner_less' is not a member of 'std'
broadcast_server.cpp:126:37: error: 'owner_less' is not a member of 'std'
broadcast_server.cpp:126:70: error: 'con_list' was not declared in this scope
broadcast_server.cpp:126:70: error: template argument 2 is invalid
broadcast_server.cpp:126:18: warning: 'typedef' was ignored in this declaration [enabled by default]
broadcast_server.cpp:129:5: error: 'con_list' does not name a type
broadcast_server.cpp: In member function 'void broadcast_server::process_messages()':
broadcast_server.cpp:109:17: error: 'm_connections' was not declared in this scope
broadcast_server.cpp:112:17: error: 'm_connections' was not declared in this scope
broadcast_server.cpp:116:17: error: 'con_list' has not been declared
broadcast_server.cpp:116:36: error: expected ';' before 'it'
broadcast_server.cpp:117:22: error: 'it' was not declared in this scope
broadcast_server.cpp:117:27: error: 'm_connections' was not declared in this scope
<>我对C++是新的,这些可能是简单的问题,但是我找不到我的方法。< /P>
“owner\u less”不是“std”的成员。

我猜当上述问题解决后,
模板参数2
错误将消失

'con_list'未在此范围内声明,而它就在
private:
中?与“m_连接”相同。

我猜当上述错误发生时,
'con_list'尚未声明
将消失

我不知道它在谈论哪个
“it”
,或者为什么它应该有一个
在它前面

版本

#include <cstdlib>
#include <iostream>
#include <memory>
#include <set>
Ubuntu 12.10

gcc--version
gcc(Ubuntu/Linaro 4.7.2-2ubuntu1)4.7.2

boost 1.53.0

额外
#包括
s

#include <cstdlib>
#include <iostream>
#include <memory>
#include <set>
我是如何安装的(依赖项、实际程序等)

欢迎选择

如果任何人有std::owner\u less
的替代方案,请发布。

阅读后,我认为在构建时需要定义
BOOST\u ROOT\u CPP11

类似于BOOST_ROOT,但允许链接到 针对C++11 STL编译的Boost

我是基于以下几点


它将使用
std::deque
而不是
std::set
。将不使用排序,但我可以告诉您,在本例中不需要排序。

std::owner\less是一个C++11 STL功能,允许您将std::weak\u ptr放入set和map等关联容器中。归根结底,连接hdl是一个弱ptr,这就是为什么它需要自定义比较功能

可以通过预处理器定义将WebSocket++0.3.x配置为使用C++03+Boost或C++11。默认情况下,它使用C++03+Boost。Boost-weak_-ptr的工作原理稍有不同,不需要自定义比较函数。如果使用列表、队列或向量,则也不需要,因为这些容器不使用连接hdl作为键

0.3.x手册中的大多数示例以及与库捆绑的示例都使用C++11,因为它更简洁明了。要按原样编译和链接这些示例,您需要一个C++11编译器,并使用适当的C++11编译器标志和WebSocket++定义。Scons是我用来自动构建和运行所有示例和单元测试的构建系统。不需要构建和运行单个示例程序。任何其他构建系统都应该可以正常工作,在命令行上临时提供编译器参数也是如此

我在手册中设置了一个页面,介绍了启用/禁用C++11功能的各种选项。本手册页面列出了我最常用于测试的操作系统和编译器的建议编译器标志

对于Linux上的g++4.7,我建议:“-std=c++0x-D\u WEBSOCKETPP\u CPP11\u STL_
-D_WEBSOCKETPP_NO_CPP11_REGEX_-lboost_REGEX-lboost_系统”。这将启用所有C++11功能,但库(已损坏/有bug)除外,并引入Boost版本。

try 35; include@SamMiller谢谢您的关注!plz c editAdd key
-std=c++11
到编译器的命令line@borisbn哇,我刚刚得到了更多的错误哈哈。谢谢你的关注!发布错误后,您需要c++11来使用std::owner\u lessThank you zaphoyd!你的自由和支持是我所经历过的最好的!首先,我还要感谢您提供了很棒的库和文档!然而,我也有这个特殊的问题。我正在与您的库一起构建一个聊天服务器,完全没有意识到D_WEBSOCKETPP_CPP11_STL_u定义对于使用std::owner_less是必要的。我可能没有足够仔细地阅读文档,但在特定示例中澄清这一点可能会更好。
#ifdef _WEBSOCKETPP_CPP11_MEMORY_
    using std::shared_ptr;
    using std::weak_ptr;
    using std::enable_shared_from_this;
    using std::static_pointer_cast;

    typedef std::unique_ptr<unsigned char[]> unique_ptr_uchar_array;
#else
    using boost::shared_ptr;
    using boost::weak_ptr;
    using boost::enable_shared_from_this;
    using boost::static_pointer_cast;

    typedef boost::scoped_array<unsigned char> unique_ptr_uchar_array;
#endif
         if (a.type == SUBSCRIBE) {
                boost::unique_lock<boost::mutex> lock(m_connection_lock);
                m_connections.push_back(a.hdl);
            } else if (a.type == UNSUBSCRIBE) {
                boost::unique_lock<boost::mutex> lock(m_connection_lock);
                m_connections.erase(std::remove(m_connections.begin(), m_connections.end(), a.hdl));
            } else if (a.type == MESSAGE) {
                boost::unique_lock<boost::mutex> lock(m_connection_lock);

                con_list::iterator it;
                for (it = m_connections.begin(); it != m_connections.end(); ++it) {
                    m_server.send(*it,a.msg);
                }
            } else {
                // undefined.
            }
        }
    }
private:
    typedef std::deque<connection_hdl> con_list;