【发布时间】:2020-07-16 06:59:03
【问题描述】:
我有以下父类:
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 upcasting to base class - best method? 仍然给我同样的错误:
error: conversion from ‘std::shared_ptr<dataserver::pointdata::Ticket>’ to non-scalar type ‘std::shared_ptr<dataserver::Request_manager::Ticket>’ requested
【问题讨论】:
-
你的意思是向上转型?
-
是的,但是当我从队列中获取它之后我想要它,我可以调用子 start() 方法
-
确保您的项目中没有循环
#includes。这可能看起来完全不相关,但有时当您尝试将shared_ptr转换为它不知道的类型时,编译器会给出非常奇怪的错误。
标签: c++ class inheritance queue