Visual Studio 2005 SP1のリリースノートより。
template <class T>
class A
{
public:
typedef int N_A;
};
template <class T>
class B : public A<T>
{
public:
typename A<T>::N_A test();
};
template <class T>
typename A<T>::N_A B<T>::test() /* 1 */
{
return 0;
}
テンプレート クラス B はテンプレート クラス A を継承しています。A<T> は入れ子になった型 N_A を持ち、B<T>::test() はこれを返します。Visual Studio 2005 SP1 のコンパイラは、/* 1 */ とマークされた行でエラー C2244 を発生します。この問題を回避するには、B<T> 内の A<T>::N_A で typedef を定義し、その typedef を B<T> 全体で使用します。この回避方法を使用する場合、上記のコードは以下のようになります。template <class T>
class A
{
public:
typedef int N_A;
};
template <class T>
class B : public A<T>
{
public:
typedef A<T>::N_A N_B; // typedef definition
typename N_B test(); // use of the typedef in the return type
};
template <class T>
typename B<T>::N_B B<T>::test() // use of the typedef in the return type
{
return 0;
}