2016-09-09 54 views
4
class MyDerived: public Incredble<Difficult< And<Complicated, Long>>, And<Even, Longer>, BaseClass, Name> 
{ 
public: 
    MyDerived(); 
} 


MyDerived::MyDerived 
: ???(params) 
{} 

有沒有什麼辦法可以調用基礎構造函數而不用寫它的全名並且沒有typedeffing它?呼叫基類的構造函數沒有命名它的類

原因顯然是爲了避免代碼重複和引入多個職位來改變,如果在基類模板params的細節變化。

級別的這個2:

template <uint32 C> 
class MyDerived: public Incredble<Difficult< And<Complicated, Long>>, And<Even, Longer>, BaseClass, Name> 
{ 
public: 
    MyDerived(); 
} 

template <uint32 C> 
MyDerived::MyDerived<C> 
: ???(C) 
{ 
} 
+1

出了什麼問題'using'或'typedef'? – max66

+1

它污染封閉名稱空間 –

+0

取決於您的構造函數,您可以使用'使用'和構造函數委託(它不污染命名空間)。取決於您是否遇到參數或模板問題。 – Hayt

回答

7

你可以使用injected-class-nameIncredible<...>::Incredible指本身,因爲MyDerived不是一個模板類,不合格的查找將看在其基類的範圍:

MyDerived::MyDerived 
: Incredble(params) 
{} 

如果Incredible依賴的名字,那麼你需要限定它。實際上,你可以簡單地使用派生類型名來限定基類的注入的類名(H/T Johannes Schaub-litb):

MyDerived::MyDerived 
: MyDerived::Incredible(params) 
{} 

這將適用於所有情況。

+1

如果MyDerived是一個臨時試驗,會做這種改變嗎?因爲它對我來說只是模板參數。我可以將此添加到最初的問題 –

+0

詳細名稱空間總是很好。 – Hayt

+0

@vlad_tepesch答案已經解決了這個問題 - 你不能使用inject-class-name,但你總是可以在非公有名字空間中添加一個別名或別名模板 – Barry

0

如果您不想使用usingtypedef以避免「污染封閉名稱空間」,您可以在類/結構中使用using

一個例子

#include <map> 

template <typename ...> 
class foo 
{}; 

struct A : public foo<int, std::tuple<long, char, std::map<std::string, int>>> 
{ 
    using base_t = foo<int, std::tuple<long, char, std::map<std::string, int>>>; 

    A() : base_t{} 
    { }; 
}; 

int main() 
{ } 
+1

你使用了兩次'Incredble'類名。 – Liviu

+0

@利維 - 沒錯!但是您可以在同一個類中使用'base_t'作其他用途(例如其他構造函數);爲了避免重複,你可以在結構外部定義'base_t',但是你污染了外部命名空間 – max66

+0

派生自stl對象通常不是好主意。我的意思是這個想法是好的,但是這個例子很糟糕 – Hayt