Hel*_*ios -1 c++ class forward-declaration zeromq
我正在尝试使用 zmq 创建一个通用节点,该节点将形成动态计算图,但是我在类中的 zmq 套接字的前向声明中遇到错误。我想知道是否有人可以阐明这一点?该类的精简版本是:
\n\n节点.hpp
\n\n/* \n * node.hpp\n*/ \n\n#ifndef NODE_\n#define NODE_\n\n#include <iostream>\n#include "zmq.hpp"\n\nclass Node\n{\nprivate:\n std::string name_;\n std::ostream& log_;\n zmq::context_t context_;\n zmq::socket_t subscriber_;\n zmq::socket_t publisher_;\n\npublic:\n Node(std::ostream& log, std::string name);\n void sendlog(std::string msg);\n};\n\n#endif // NODE_ \nRun Code Online (Sandbox Code Playgroud)\n\n节点.cpp
\n\n/* \n * node.cpp\n*/ \n\n#include <iostream>\n#include <string>\n#include "zmq.hpp"\n#include "node.hpp"\n\nNode::Node(std::ostream& log, std::string name): \n log_(log),\n name_(name)\n{\n sendlog(std::string("initialising ") + name_);\n\n zmq::context_t context_(1);\n zmq::socket_t subscriber_(context_, zmq::socket_type::sub);\n zmq::socket_t publisher_(context_, zmq::socket_type::pub);\n\n subscriber_.connect("ipc:///tmp/out.ipc");\n publisher_.connect("ipc:///tmp/in.ipc");\n\n sendlog(std::string("finished initialisation"));\n}\n\nvoid Node::sendlog(std::string msg)\n{\n this->log_ << msg << std::endl;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n我从 g++ 得到的错误
\n\ng++ main.cpp node.cpp -lzmq\n\nnode.cpp: In constructor \xe2\x80\x98Node::Node(std::ostream&, std::__cxx11::string)\xe2\x80\x99:\nnode.cpp:12:15: error: no matching function for call to \xe2\x80\x98zmq::socket_t::socket_t()\xe2\x80\x99\n name_(name)\nRun Code Online (Sandbox Code Playgroud)\n\n但是当我查看 zmq.hpp 时我看到
\n\nnamespace zmq\n{\nclass socket_t : public detail::socket_base\n...\nRun Code Online (Sandbox Code Playgroud)\n\n我认为我在某种程度上做的声明不正确?我不太精通 cpp,但我将其用作一个项目来重新开始,因此欢迎一般评论/文献参考。
\n显示的代码有两个问题。首先与...
zmq::context_t context_(1);
zmq::socket_t subscriber_(context_, zmq::socket_type::sub);
zmq::socket_t publisher_(context_, zmq::socket_type::pub);
Run Code Online (Sandbox Code Playgroud)
您正在创建本地作用域的变量,这些变量会隐藏同名的成员变量。其次,因为您没有显式初始化subscriber_或publisher_在构造函数的初始化程序列表中,编译器将尝试使用对其默认构造函数的隐式调用。但zmq::socket_t没有默认构造函数,因此您会看到错误。
context_修复方法只是将,subscriber_和成员的初始化移动publisher_到 ctor 的初始化列表中...
Node::Node(std::ostream& log, std::string name)
: log_(log)
, name_(name)
, context_(1)
, subscriber_(context_, zmq::socket_type::sub)
, publisher_(context_, zmq::socket_type::pub)
{
sendlog(std::string("initialising ") + name_);
subscriber_.connect("ipc:///tmp/out.ipc");
publisher_.connect("ipc:///tmp/in.ipc");
sendlog(std::string("finished initialisation"));
}
Run Code Online (Sandbox Code Playgroud)