几个星期前,我为这样的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)中使用这种模式已经两周了,它的工作和编译都很好。
为什么MSVC11似乎不遵循此语言规则?
注意:此问题不是Propagating 'typedef' from based to derived class for 'template'或其副本的重复,它会询问为什么应该是错误的内容在MSVC中有效。