想象一下以下代码:
class Request_manager{
public:
virtual ~Request_manager();
protected:
explicit Request_manager(type0 start_time);
}
class Ticket : Request_manager{
public:
Ticket(type1 rq, type2* dataserver,
type3 tix, type4 start_time);
}
class Card : Request_manager{
public:
Card(type5 xd, type6* people,
type7 tr, type8 play_time);
}
现在,我有一个要保存Ticket
和Card
的队列。为此,我创建了一个名为Tickets_Queue
的类
class Tickets_Queue{
public:
void push(std::shared_ptr<Request_manager> ticket);
}
当我从代码中的某个地方实例化时(取决于我可能处理的脚本Card
或Ticket
(:
Tickets_Queue ticket_queue;
auto ticket = std::make_shared<Request_manager>(...,..., ..., ...);
ticket_queue_->push(ticket);
我得到了这样的东西:
/usr/include/c++/5/bits/shared_ptr.h:635:39: required from ‘std::shared_ptr<_Tp1> std::make_shared(_Args&& ...) [with _Tp = dataserver::Request_manager; _Args = {dataserver::pointdata::Batch_request, dataserver::Data_interface*&, xxxxx::service::Service_ticket&, dataserver::System_time&}]’
data_interfaces/pointdata/Interface.cpp:48:72: required from here
/usr/include/c++/5/ext/new_allocator.h:120:4: error: no matching function for call to ‘dataserver::Request_manager(dataserver::pointdata::Batch_request, dataserver::Data_interface*&, ubimet::service::Service_ticket&, dataserver::System_time&)’
{ ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
^
In file included from data_interfaces/Tickets_Queue.h:5:0,
from data_interfaces/pointdata/Interface.h:7,
from data_interfaces/pointdata/Interface.cpp:1:
data_interfaces/Request_manager.h:30:18: note: candidate: dataserver::Request_manager(dataserver::System_time)
explicit Ticket(System_time start_time);
^
data_interfaces/Request_manager.h:30:18: note: candidate expects 1 argument, 4 provided
data_interfaces/Request_manager.h:24:11: note: candidate: constexpr dataserver::Request_manager::Request_manager(const Request_manager&)
class Ticket {
^
data_interfaces/Request_manager.h:24:11: note: candidate expects 1 argument, 4 provided
另一方面,如果我这样做:
auto ticket = std::make_shared<Ticket>(...,...,...,...);
ticket_queue_->push(ticket);
它告诉我:
no suitable user-defined conversion from "std::shared_ptr<Ticket>" to "std::shared_ptr<Request_manager>" exists
这很奇怪,因为Ticket
是Request_manager
的子代,所以它应该能够被广播。
如果这是所有相关代码,则
auto ticket = std::make_shared<Request_manager>(...,..., ..., ...);
不可能工作:Request_manager没有接受四个参数的构造函数。
您可以拥有多态shared_ptrs的队列;但是,当您创建一个队列项目时,您需要创建一个指向派生类型之一的共享指针,并将其放入队列中,例如
std::shared_ptr<Request_manager> ticket = std::make_shared<Ticket>(...,..., ..., ...);
在上面。为了使上述功能发挥作用,Ticket和Card必须公开继承Request_manager。如下
class Ticket : public Request_manager{
public:
Ticket(type1 rq, type2* dataserver,
type3 tix, type4 start_time);
}
class Card : public Request_manager{
public:
Card(type5 xd, type6* people,
type7 tr, type8 play_time);
}
...
std::shared_ptr<Request_manager> ticket = std::make_shared<Ticket>(...,..., ..., ...);