我有一个带有两个子类TCP和Domain的类Listener。我尝试创建一个unique_ptr,它将包含TCP或Domain的实例,具体取决于业务逻辑。出于某种原因,我无法理解,这会导致错误:cannot initialize a parameter of type xxx::Listener *with an rvalue of type xxx::Domain *
这是我的代码:
unique_ptr<Listener> Listener::create(const Parameters& parameters) {
unique_ptr<Listener> listener;
if (parameters.socket.empty()) {
listener.reset(new TCP(parameters));
} else {
listener.reset(new Domain(parameters));
}
return listener;
}
更新
Domain和TCP确实是Listener的孩子。项目中没有其他具有相同名称的类。还有什么我可以做的进一步调试吗?
答案 0 :(得分:1)
std::unique_ptr::reset
将指针带到Listener
的模板arg,因此域名必须来自Listener
。
答案 1 :(得分:1)
这是一个MVCE,它表明问题在于这些类与您的思维方式无关,或者Domain
和TCP
没有解析您在代码中此位置的想法。
#include <memory>
struct A {};
struct B : public A {};
struct C : public A {};
struct D : public C {};
int main() {
std::unique_ptr<A> ptr;
ptr.reset(new B);
ptr.reset(new C);
ptr.reset(new D);
}
并且是失败的证明,请注意“分支”很好,但DIAMOND给出了“模棱两可”的错误:
#include <memory>
struct Listener {};
struct TCP : public Listener {};
struct Domain : public Listener {};
struct A {};
struct Branch : public TCP, public A {};
struct DIAMOND : public TCP, public Domain {};
int main() {
std::unique_ptr<Listener> ptr;
ptr.reset(new TCP);
ptr.reset(new Domain);
ptr.reset(new Branch);
ptr.reset(new DIAMOND);
}
Ideone:http://ideone.com/prjXeL