テンプレートをいじっています。私はstd :: vectorを再発明しようとはしていません。C++でのテンプレート化を理解しようとしています。
次のことができますか?
template <typename T>
typedef struct{
size_t x;
T *ary;
}array;
私がやろうとしているのは、次の基本的なテンプレートバージョンです:
typedef struct{
size_t x;
int *ary;
}iArray;
構造体の代わりにクラスを使用すると動作しているように見えるので、typedef構造体では不可能ですか?
問題は、typedefをテンプレート化できず、C++でtypedef構造体を作成する必要がないことです。
以下は必要なことを行います
template <typename T>
struct array {
size_t x;
T *ary;
};
template <typename T>
struct array {
size_t x;
T *ary;
};
クラスと構造体に対して明示的なtypedef
を実行する必要はありません。 typedef
が必要なのは何ですか?さらに、template<...>
の後のtypedef
は構文的に間違っています。単に使用します:
template <class T>
struct array {
size_t x;
T *ary;
} ;
クラスだけでなく構造体もテンプレート化できます。ただし、typedefをテンプレート化することはできません。そう template<typename T> struct array {...};
は動作しますが、template<typename T> typedef struct {...} array;
ではない。 C++ではtypedefトリックは不要であることに注意してください(C++ではstruct
修飾子なしで構造体を使用できます)。
標準では、(14/3で。非標準の人々の場合、クラス定義本体(または一般に宣言の型)に続く名前は「宣言子」です)
テンプレート宣言、明示的な特殊化、または明示的なインスタンス化では、宣言のinit-declarator-listには最大で1つの宣言子が含まれます。このような宣言を使用してクラステンプレートを宣言する場合、宣言子は許可されません。
アンドレイのショーのようにやってください。
構文が間違っています。 typedef
は削除する必要があります。
他の答えから、問題は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
}
}