2017-07-07 1 views
0

初心者はC++で、char型またはint型を含む追加テンプレートを作成しようとしています。その後、入力データのパディングに応じて、このテンプレートを他のテンプレートで使用してデータのタイプを選択したいと考えています。テンプレートの特殊化の中でtypedefを使用する

template <bool isPadding> 
class PaddingTemplate; 

template <> 
class PaddingTemplate<false> 
{ 
public: 
    typedef char Type; 
}; 

template <> 
class PaddingTemplate<true> 
{ 
public: 
    typedef int Type; 
}; 

template <class T, bool Padding = ((sizeof(T) % sizeof(int)) == 0)> 
class ObjectComparator 
{ 
private: 
    typedef  PaddingTemplate<Padding> PaddingTrick; 
    typename PaddingTrick::Type   DataType; 

    DataType Shadow[sizeof(T)/sizeof(DataType)]; 
}; 

私はこのコンパイラエラーの問題を解決し、データパディングに応じて、データ型の選択を自動化する方法

Compiler msg

を取得しますか?

答えて

4

DataTypeは実際にタイプではありません。これはPaddingTrick::Typeのインスタンスなので、次の行でエラーが表示されます。あなたはする必要があります:

typedef typename PaddingTrick::Type DataType; 
+0

ありがとうございました!出来た! typenameとtypedefの組み合わせがこのコードでどのように機能するかをもっと説明できますか? – Ilia

+1

@Iliaのすべての 'typename'は、あなたが探している従属名が型であることを意味します:それは値でもテンプレートでもあります。 'typename Class :: type data'を使うと、その型のオブジェクトを構築したいということです。 'typedef typename Class :: type type'はエイリアスが必要であることを意味します。 なぜ 'typename'が必要なのか、これは素晴らしい答えです: https://stackoverflow.com/a/8584507/4131059 –

+0

すごいプログラミング言語С++!おかげさまで、ロシアの大きな挨拶に感謝します。 – Ilia

関連する問題