typedefはタイプの定義に使用されます。
-
単純化、明確化のため。たとえば、
vector<list<int *>*> temp(10);
次のように簡略化できます。
typedef list<int *> listnum; typedef vector<listnum *> vectornum; vectornum temp(10);
-
メンバーへのポインターを定義します。
class A { public: virtual void sup() = 0; }; typedef void (A::* pt)(); void f(A *a) { pt ptemp = &A::sup; }
typedef typename
-
template <typename var_name> class class_name;は、var_nameがタイプであることを示します。これは、テンプレートがインスタンス化されるときに、組み込みタイプ(intなど)だけでなく、カスタムタイプクラスも含む任意のタイプを置き換えることができます。これが問題のフォームです。つまり、テンプレートとテンプレートでは、typenameとclassはまったく同じ意味です。
-
typename var_name;は、var_nameの定義がまだ指定されていないことを意味します。このステートメントは通常、テンプレートの定義に表示されます。次に例を示します。
template <class T> void f() { typedef typename T::A TA; // 声明 TA 的类型为 T::A TA a5; // 声明 a5 的类型为 TA typename T::A a6; // 声明 a6 的类型为 T::A TA * pta6; // 声明 pta6 的类型为 TA 的指针 }
Tはテンプレートがインスタンス化されたときにのみ認識されるタイプであるため、コンパイラーはT :: A についてより無知です
。T:: Aが有効なタイプであることをコンパイラーに通知するために、typenameステートメントはコンパイラーがエラーを報告しないようにすることができます。