2014-03-06 67 views
1

從模板的多個實例繼承時,我遇到了問題。C++多繼承 - 帶模板的鑽石

我的類Bridge試圖從BridgeTemplate的兩個實例繼承,所以當我們嘗試調用BridgeTemplate的'set'函數時,編譯器會產生一個錯誤(「ambiguous ...」)。但是,如果Bridge僅從1個實例繼承,那麼一切正常。

下面是來自模板和類橋的一段代碼。在此先感謝

template <class DataType, class DataWriter> 
class BridgeTemplate : public BridgeGeneric 
{ 
    public: 
     void set(DataType a, DataWriter b) 
     { 
      std::cout << "a: " << a << "; b: " << b << std::endl; 
     } 
... 
}; 

class Bridge : public virtual BridgeTemplate<int,float>, public virtual BridgeTemplate<float,int> 
{ 
... 
} 
+0

所以,如果你做你在做什麼,你會得到一個編譯器錯誤。閱讀確切的消息或至少在這裏發佈呢? http://ericlippert.com/2014/03/05/how-to-debug-small-programs/ – Samuel

+0

嗨,歡迎來到Stack Overflow!當詢問編譯器錯誤時,請始終包含完整的錯誤文本,並且還包含重現錯誤的代碼(最好是[SSCCE](http://sscce.org/))。 – Angew

+0

注意:你在錯誤的地方有虛擬的地方,它不能再做任何好事。如果你想'BridgeGeneric'只出現一次,你必須從虛擬中派生出來。我也懷疑你是因爲重載解析模糊而得到錯誤的,如果沒有涉及繼承的話會是相同的。但這就是爲什麼我們需要複製代碼來說明。 – Angew

回答

1

參數類型無關緊要。

該錯誤消息適用於名稱查找,而不是重載解析。所有重載函數必須來自同一個類或名稱空間。爲了保證,使用這種模式:

class Child : public Dad, public Mom { 
    using Dad::func; 
    using Mom::func; 
}; 

// ... 

Child c; 
c.foo(1, 2.3); 

因爲using聲明,既func成員被帶到Child命名空間和查找不再是模糊的。