1

以下のコマンドを使用できる必要があります。ここで、T は文字列などの任意の型にすることができます。

Counter<T> counter;  

カウンターは複数のアイテムを保持できる必要があるため、これをベクターとして実装することにしました。各項目自体は、T 型の変数 (上記の例を続けると文字列) と int で構成されている必要があります。後で、他のタスクの中で int 値を降順で各アイテムを出力する関数を作成する必要があるため、ソリューションをできるだけシンプルに保つ必要があります。次のコードを試してみましたが、1) 機能しません。2) より良い解決策はありますか?

#include<string>
#include<cstdlib>
#include<vector>

template<class T>
class Record{
      T itemtype;
      int total;   
   public:
      int increment(T item);
      int count(T item);
      void printSummary();
};


class Counter{
      vector<Record> data;
};

int main(){

   Counter<string> counter;   

   return 0;
}
4

4 に答える 4

2

あなたはそれを間違えました、あなたはパラメータ化可能にする必要がありCounterます:

template <typename T>
class Counter{
      vector<Record<T> > data;
};

もちろん、これはあなたのcounter意志のすべてのレコードが文字列を含むことを意味します。

「カウンターが複数のアイテムを保持できる必要がある」が、の 1 つのインスタンスにCounterさまざまな型またはレコード (たとえば、文字列と整数の両方) を含める必要があることを実際に意味する場合は、要件とテクノロジに応じて、またはまたは類似のVARIANTものboost::anyを使用する必要があります。boost::variant使用、例えば

Counter<boost::any> counter;
于 2013-04-11T11:42:57.037 に答える
2

あなたのプログラムには、以下に指摘されているいくつかの誤りがあります。

軽微な問題:

まず第一に、些細なこと:<cstdlib>ヘッダーを含める必要はありません。

#include<string>
// #include<cstdlib> // <== (YOU DON'T SEEM TO NEED THIS)
#include<vector>

最初の問題:

名前空間に存在するオブジェクトを参照するために非修飾名を使用する場合using、コンパイラがそれらの非修飾名を正しい完全修飾名 (つまり、それらが属する名前空間を含む) に解決できるようにする宣言が最初に必要です。

たとえば、名前空間vectorstring属しています。stdしたがって、これらの名前を完全修飾形式 ( std::vectorand ) で使用するか、以下のように適切な宣言std::stringを追加します。using

using std::vector; // USING DECLARATIONS TO ALLOW UNQUALIFIED NAMES SUCH AS
using std::string; // string AND vector TO BE CORRECTLY RESOLVED

2番目の問題:

最後に、必要なのはクラスCounterをパラメーター化することであり、そのパラメーターは internal のインスタンス化に使用する必要がありますvector。したがって、Counterクラス テンプレートでもある必要があります (main()結局のところ、これが関数内での使用方法です)。

// MAKE THIS A CLASS TEMPLATE!
template<typename T>
class Counter{
      vector<Record<T>> data;
};

結論:

上記の修正をすべて実装すると、コードは次のようになります。

#include<string>
#include<vector>

using std::vector;
using std::string;

template<class T>
class Record{
      T itemtype;
      int total;   
   public:
      int increment(T item);
      int count(T item);
      void printSummary();
};

template<typename T>
class Counter{
      vector<Record<T>> data;
};

int main(){

   Counter<string> counter;   

   return 0;
}

上記のコードのコンパイルを示す実際の例を次に示します。

于 2013-04-11T11:44:07.953 に答える
0

Recordはテンプレートであるためvector<Record>、レコードのタイプのベクトルが必要です。つまり、vector<Record<T> >

于 2013-04-11T11:45:29.947 に答える
0

私はあなたがこれをするつもりだったと思います:

template<class T>
class Record{
      T itemtype;
      int total;   
   public:
      int increment(T item);
      int count(T item);
      void printSummary();
};

template<class RECORDTYPE>
class Counter{
      vector<Record<RECORDTYPE>> data;
};

int main(){

   Counter<string> counter;   

   return 0;
}
于 2013-04-11T11:43:41.480 に答える