2015-06-11 42 views
-5

我有一個類Listener與兩個子類,TCP和域。我正在嘗試創建一個unique_ptr,它將保存TCP或Domain的實例,具體取決於業務邏輯。出於某種原因,我不明白,這將導致一個錯誤:cannot initialize a parameter of type xxx::Listener *with an rvalue of type xxx::Domain *爲什麼我無法創建這個unique_ptr?

這裏是我的代碼:

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

更新

域和TCP確實偵聽的孩子。項目中沒有其他同名的類。還有什麼我可以做進一步調試?

+4

你100%肯定'Domain'是'Listener'的子類嗎? –

+0

「還有什麼我可以做的進一步調試」1 /創建一個MVCE,2 /仔細查看錯誤信息,並失敗3/post 1和2.如果你看我的答案中的第二個MVCE ,顯然你得到的錯誤是編譯器明確地告訴你「xxx :: Domain」不是從「xxx :: Listener」公開派生的。 – kfsone

+2

這就是爲什麼你應該發佈**測試用例**。經過六年多的時間,你現在應該知道這一點。 –

回答

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

+0

這可能是,實際上。在我的情況下Listener Listener從父類繼承。爲什麼這會成爲一個問題? – ruipacheco

+0

繼承層次結構是什麼樣的? – kfsone

相關問題