我有以下父类:
namespace dataserver {
class Request_manager {
public:
class Ticket {
public:
virtual void start(){};
virtual ~Ticket();
explicit Ticket(System_time start_time);
protected:
System_time const& start_time() const { return m_start_time; }
System_time m_start_time;
private:
std::time_t m_key;
std::size_t m_request_id;
};
static int num_connected() { return m_connected; }
private:
static int m_connected;
};
} // namespace dataserver
#endif // _DATASERVER_REQUEST_MANAGER_H_
还有一个儿童班:
namespace dataserver {
namespace pointdata {
class Ticket : Request_manager::Ticket,
public std::enable_shared_from_this<Ticket> {
public:
Ticket(Batch_request rq, Data_interface* dataserver,
xxx::service::Service_ticket tix, System_time start_time);
void start();
private:
void serialize(std::vector<Future<Group_result>> data_f);
void failed(std::exception_ptr error);
};
}
} // namespace dataserver::pointdata
#endif // _DATASERVER_POINTDATA_TICKET_H_
我有来自Request_manager的其他子类,我想把它们一起保存在队列中。假设我不需要创建父类的任何对象。为了实现这一点,我有一个类Tickets_Queue
using namespace dataserver;
class Tickets_Queue{
private:
std::queue <std::shared_ptr<Request_manager::Ticket>> m_ticket_queue;
public:
Tickets_Queue();
~Tickets_Queue();
void push(std::shared_ptr<Request_manager::Ticket> ticket);
};
#endif /* _TICKETS_QUEUE_H_ */
要推动不同类型的孩子我做:
std::shared_ptr<Request_manager::Ticket> ticket = std::make_shared<Ticket>(...,
..., ..., ...);
ticket_queue_->push(ticket);
这给了我错误:
error: conversion from ‘std::shared_ptr<dataserver::pointdata::Ticket>’ to non-scalar type ‘std::shared_ptr<dataserver::Request_manager::Ticket>’ requested
编辑
正在尝试:std::shared_ptr向基类上转换-最佳方法?仍然给我同样的错误:
error: conversion from ‘std::shared_ptr<dataserver::pointdata::Ticket>’ to non-scalar type ‘std::shared_ptr<dataserver::Request_manager::Ticket>’ requested
问题可能与私有继承有关。
#include <iostream>
class A {};
class B: public A {}; //<-- fails to compile if "public" is omitted
int main()
{
std::shared_ptr<A> a(new B);
}