2012-05-18 50 views
0

我嘗試使用從另一個模板類繼承的部分專用模板類。我不知道如何去。這裏是我的代碼:從模板類繼承的C++模板類

template < typename T> 
struct SmallContainer 
{ 
    typedef vector<T> type; 
}; 

template<typename CONTAINER, typename T> 
class AnotherClass : public CONTAINER<SmallContainer<T>::type> 
{ // ..... }; 

和gcc保持之前 '<' 令牌

預期模板的名稱前 '<' 令牌 預期的 '{' 前 '<' 令牌 預期不合格-ID說我的對象的想法是讓AnotherClass成爲我想要的任何其他類型的向量的通用容器。

我試着做模板<模板CONTAINER,typename T> etc ...沒有任何成功。 有什麼想法? 謝謝...

回答

2

這將工作只是一個模板參數的容器:

template< template<typename> class Container, typename T > 
class AnotherClass 
    : public Container< typename SmallContainer<T>::type > 
{}; 

然而,這不會爲任何標準集裝箱的工作,因爲他們有額外的模板參數(如分配器)。

請注意,在SmallContainer<T>::type之前需要typename,否則編譯器會認爲它指的是一個值。

+1

可變模板簽名將匹配任何具體簽名:'template class Container'。 –

+0

@Kerrek SB:除非它有非類型的模板參數,比如'std :: array'。 –

0

這不能真正做到,無論如何不是STL容器。您可以爲每個容器創建一個類似SmallContainer的包裝器,以便您可以提供默認參數,但STL容器大部分不共享通用參數。此外,沒有辦法匹配任意類型的第三方模板。但是,給定包裝器或C++ 11別名,您可以將CONTAINER變爲模板模板參數。

請注意,沒有任何標準庫容器模板會採用單個模板參數,它們具有您通常不會使用的默認設置,因此您通常只提供一個,但迄今爲止建議的答案都不適用於標準庫模板。

3

讓用戶指定容器的常用方法是將實際容器作爲模板參數,而不僅僅是容器模板。這也是標準庫如何指定容器適配器。例如:

template <typename T, typename Container = std::vector<T>> 
class Foo 
{ 
public: 
    typedef Container container_type; 

    void multiply_all() 
    { 
     using std::begin; 
     using std::end; 

     for (auto it(begin(c)), e(end(c)); it != e; ++it) 
     { 
      *it = *it + *it; 
     } 
    } 

private: 
    container_type c; 
}; 

現在,用戶可以創建其他實例一樣Foo<int, CrazyContainer<int, true, Blue>> x;,你永遠不必擔心它們的容器的細節。