2017-04-05 8 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は」mainProgram.cpp

で[ライブラリINTLIB]ライン上で未定義のクラスのライブラリ」を使用していますC3855 'library':テンプレートパラメータ 'C'は、行[]の 宣言と互換性がありません。 ]最後の行

C3855 'library':テンプレートパラメータ 'vector'は、行[]の宣言と互換性がありません。 ] library.h(また、最後の行)

私はテンプレートテンプレートのパラメータに関してさまざまな記事を見てきましたが、この回答はこれまで問題になっていませんでしたが、 mが現在有する:同じテンプレートを使用して、すべての主要で

 library<resistor, vector<resistor>> resistor_lib; 
     library<capacitor, vector<capacitor>> capacitor_lib; 
     library<inductor, vector<inductor>> inductor_lib; 
     library<component, vector<component>> component_lib; 

Template class with template container

所望の結果は以下のような文を書くことができるようになります。

おかげで、任意のヘルプは非常に

+0

のように宣言され、またあなたは、すべてのpublicコンストラクタを持っています。 – 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_typeおよびvalue_typeを使用して、コンテナおよびオブジェクトの種類を参照できます。

インスタンスは、デフォルトのコンストラクタを持っていない

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

標準コンテナはコピーコンストラクタブルです。ライブラリのコンストラクタの初期化リストでcontainer_をコピー初期化することができます –

関連する問題