2017-04-05 102 views
1

如何可以聲明一個模板類(組分的文庫),其將採取包含組件作爲一個參數的向量的模板容器模板類? 下面是代碼一個精簡版作爲一個例子:如何創建具有不同的對象作爲參數

// In Library.h 
    using namespace std; 

    template<typename T, 
     template <typename, typename = std:allocator<T>> class Container> 
    class library { 
     Container<T> comp_lib; 
     library(Container<T> &Vc) {comp_lib = Vc} 
    }; 

    // In mainProgram.cpp 
    #include "Library.h" 
    // Other includes... 
    using namespace std; 

    int main() { 
    library<int, vector> intLib; 
    return(0); 
    } 

正如我所提到之前這意味着是一個組件庫。因此,庫模板不是保存含整數的矢量,而是保存包含通用組件的矢量,包含電阻的矢量,包含電容的矢量和包含電感的矢量。電阻器,電容器和電感器都是來自組件基類的派生類。

當運行的代碼,它不編譯和我收到這些錯誤消息:

C2079:「intLib」使用未定義類「圖書館」上線[庫intLib]在mainProgram.cpp

C3855「圖書館」:模板參數「C」是用線申報 [}不相容; ]在library.h(最後一行)

C3855「圖書館」:模板參數「載體」是用線的聲明[}不相容;在library.h(也,最後一行)

我已經看了很多不同物品的關於模板模板參數,這個答案已經非常有用,到目前爲止,儘管它似乎並沒有解決我問題米目前具有: Template class with template container

期望的結果是,能夠寫的語句,例如:使用相同的模板

 library<resistor, vector<resistor>> resistor_lib; 
     library<capacitor, vector<capacitor>> capacitor_lib; 
     library<inductor, vector<inductor>> inductor_lib; 
     library<component, vector<component>> component_lib; 
在主所有

感謝,任何幫助深表感謝

+0

您沒有默認的構造函數,也不是你有一個公共的構造的。 – Incomputable

+0

是的,道歉,忘了添加構造函數的例子。這只是一小段代碼,試圖說明問題而不太複雜。原代碼確實有公共的默認和參數化的構造函數,仍然不能編譯 –

回答

1

你只需要到模板的容器,然後讓它告訴存儲的類型。標準容器通過value_type的定義來實現。這樣做:

template <typename TContainer> 
class Library { 
private: 

    TContainer container_; 

public: 

    using container_type = TContainer; 
    using value_type = typename TContainer::value_type; 

    Library(const container_type &initValues) { 
     std::copy(initValues.begin(), initValues.end(), 
      std::back_inserter(container_)); 
    } 

    [...] 
}; 

這應該與vectorlist工作,可以 「back_inserted」 的一切。此外可以通過的container_typevalue_type裝置引用該容器和對象類型。

實例的聲明像

Library<std::vector<int> > lib(someInitializer); 
+0

性病容器是拷貝構造。您可以在Library的構造函數初始化列表中複製初始化container_ –

相關問題