初始化基类时出现以下错误,该基类的构造函数使用临时对象(jsonrpc::HttpServer(port)
)进行引用。我认为std::move
适用于这种情况,但std::move(jsonrpc::HttpServer(port)
也不起作用。有什么想法吗?
class Server : public jsonrpc::AbstractServer<Server>
{
public:
Server(jsonrpc::AbstractServerConnector &conn) : jsonrpc::AbstractServer<Server>(conn)
{
//...
}
};
class MyServer: public Server {
public: MyServer(int port);
}
// error
MyServer::EnclaveRPC(int port):Server(jsonrpc::HttpServer(port)){}
MyServer::EnclaveRPC(int port):Server(std::move(jsonrpc::HttpServer(port))){}
错误:从'jsonrpc :: AbstractServerConnector'类型的右值开始,无效初始化'jsonrpc :: AbstractServerConnector&amp;'类型的非const引用 :服务器(jsonrpc :: HttpServer(port)){
答案 0 :(得分:4)
MyServer::EnclaveRPC(int port):Server(jsonrpc::HttpServer(port)){}
在这里创建一个类型为jsonrpc::HttpServer
(rvalue)的临时对象,并尝试将其作为左值引用传递,这是有充分理由的。 jsonrpc::AbstractServer
可以将它存储为成员(很可能是它)以便稍后使用它,但是在执行程序的下一行之前将删除temp对象
P.S。
jsonrpc
库提供了jsonrpc::AbstractServer
的弱接口。它应该取得连接的所有权(例如std::unique_ptr
)或至少std::shared_ptr
的共享所有权
答案 1 :(得分:2)
您的班级不是jsonrpc::AbstractServerConnector
的所有者,因为参考不带有所有权。
就此而言,您必须将它发送给您,因为所有者是外部的:
struct Server : jsonrpc::AbstractServer<Server>
{
Server(jsonrpc::AbstractServerConnector& conn) : jsonrpc::AbstractServer<Server>(conn)
{
//...
}
};
struct MyServer : Server {
MyServer(jsonrpc::AbstractServerConnector& conn) : Server{conn} {}
};
这可能就是你所需要的。
但是,如果您坚持成为资源的所有者,则可以创建一个属于您的第一个父级的拥有类:
struct HttpConnectionOwner {
explicit HttpConnectionOwner(int port) : conn{port} {}
jsonrpc::HttpServer conn;
};
struct MyServer : HttpConnectionOwner, Server {
explicit MyServer(int port) : HttpConnectionOwner{port}, Server{conn} {}
};
此外,如果您有许多连接类型,您可以让您的班级选择您需要的连接类型:
template<typename ConnectionType>
struct MyServer : ConnectionType, Server {
using ConnectionType::conn; // conn is now a dependent name
explicit MyServer(int port) : ConnectionType{port}, Server{conn} {}
};
using MyHttpServer = MyServer<HttpConnectionOwner>;
using MyWebSocketServer = MyServer<WebSocketConnectionOwner>;
答案 2 :(得分:0)
您可以随时使用指针,但为了100%安全,请将其设为unique_ptr
或shared_ptr
,如下所示:
class testTempUnique {
public:
testTempUnique(unique_ptr<int> &inPtr)
: myPtr{ std::move(inPtr) } { }
unique_ptr<int> myPtr;
};
auto mygeneratedClass = testTempUnique(make_unique<int>(5));
cout << "value inside is: " << *(mygeneratedClass.myPtr) << endl;
我有一个int
,但你明白了。如果您想要使对象在其他地方“有效”,请使用shared_ptr<T>
代替。