数週間前、私は次のような 2D エンティティの特性クラスを書きました:
template<typename T>
struct traits_2d
{
typedef T coordinates_type;
typedef vector_2d<T> position_type;
typedef vector_2d<T> direction_type;
typedef vector_2d<T> size_type;
};
特性クラスは次のように使用されました。
template<typename T>
struct aabb_2d : public traits_2d<T>
{
position_type origin;
size_type size;
};
標準では、テンプレートに依存する名前は完全に修飾する必要があるため、これはコンパイルしないでください。もちろん、GCC のコンパイルは失敗し、次のようなメッセージが表示されます。
ネストされた名前指定子が必要です。'
typename traits_2d<T>::position_type
' の可能性があります。
しかし、一方で、MSVC11 (Visual Studio 2012) でこのパターンを 2 週間使用していたところ、問題なく動作し、コンパイルされました。
MSVC11 がこの言語規則に従っていないように見えるのはなぜですか?
注:この質問は、「typedef」を「テンプレート」のベースクラスから派生クラスに伝播する、またはその複製の複製ではありません。MSVC でエラーになるはずのものがなぜ機能するのかを尋ねます。