web-dev-qa-db-ja.com

C ++のテンプレート変数を使用した構造

テンプレートをいじっています。私はstd :: vectorを再発明しようとはしていません。C++でのテンプレート化を理解しようとしています。

次のことができますか?

template <typename T>
typedef struct{
  size_t x;
  T *ary;
}array;

私がやろうとしているのは、次の基本的なテンプレートバージョンです:

typedef struct{
  size_t x;
  int *ary;
}iArray;

構造体の代わりにクラスを使用すると動作しているように見えるので、typedef構造体では不可能ですか?

61
monkeyking

問題は、typedefをテンプレート化できず、C++でtypedef構造体を作成する必要がないことです。

以下は必要なことを行います

template <typename T> 
struct array { 
  size_t x; 
  T *ary; 
}; 
129
Binary Worrier
template <typename T>
struct array {
  size_t x;
  T *ary;
};
18
Andrey

クラスと構造体に対して明示的なtypedefを実行する必要はありません。 typedefが必要なのは何ですか?さらに、template<...>の後のtypedefは構文的に間違っています。単に使用します:

template <class T>
struct array {
  size_t x;
  T *ary;
} ;
9
dirkgently

クラスだけでなく構造体もテンプレート化できます。ただし、typedefをテンプレート化することはできません。そう template<typename T> struct array {...};は動作しますが、template<typename T> typedef struct {...} array; ではない。 C++ではtypedefトリックは不要であることに注意してください(C++ではstruct修飾子なしで構造体を使用できます)。

5
sepp2k

標準では、(14/3で。非標準の人々の場合、クラス定義本体(または一般に宣言の型)に続く名前は「宣言子」です)

テンプレート宣言、明示的な特殊化、または明示的なインスタンス化では、宣言のinit-declarator-listには最大で1つの宣言子が含まれます。このような宣言を使用してクラステンプレートを宣言する場合、宣言子は許可されません。

アンドレイのショーのようにやってください。

構文が間違っています。 typedefは削除する必要があります。

3
webgenius

他の答えから、問題はtypedefをテンプレート化していることです。これを行う唯一の「方法」は、テンプレートクラスを使用することです。すなわち、基本的なテンプレートのメタプログラミング。

template<class T> class vector_Typedefs {
    /*typedef*/ struct array { //The typedef isn't necessary
        size_t x; 
        T *ary; 
    }; 

    //Any other templated typedefs you need. Think of the templated class like something
    // between a function and namespace.
}

//An advantage is:
template<> class vector_Typedefs<bool>
{
    struct array {
        //Special behavior for the binary array
    }
}
3
Narfanator