1

数週間前、私は次のような 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 でエラーになるはずのものがなぜ機能するのかを尋ねます。

4

0 に答える 0