为什么我不能创建这个unique_ptr?

时间:2015-06-11 20:57:28

标签: c++ c++11

我有一个带有两个子类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的孩子。项目中没有其他具有相同名称的类。还有什么我可以做的进一步调试吗?

2 个答案:

答案 0 :(得分:1)

std::unique_ptr::reset指针带到Listener的模板arg,因此域名必须来自Listener

答案 1 :(得分:1)

这是一个MVCE,它表明问题在于这些类与您的思维方式无关,或者DomainTCP没有解析您在代码中此位置的想法。

#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);
}

现场演示:http://ideone.com/2qhIqC

并且是失败的证明,请注意“分支”很好,但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