meryngii.neta

今日も新たな"ネタ"を求めて。

typedefのtypename

このコードはVC++8.0でエラー(警告はC4346)になる。

template <typename T>
class A
{
    typedef std::vector<T>::iterator type; // エラー
};

テンプレート引数が関わると、型メンバを指定するのにこんな風にtypenameが必要なときがある。

template <typename T>
class A
{
    typedef typename std::vector<T>::iterator type; // OK
};

でも、typedefの次は型と決まっているわけで、制約する必要は無いのではないだろうか。他の例を見ると、継承元を指定する場合はtypenameをつけると返ってエラー(C2518)になる。

template <typename T>
class A
	: public typename std::vector<T>::iterator // エラー
{
	
};