几周前,我为这样的二维实体编写了一个特征类:
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 中起作用。