C++ MSVC:“;使用类模板需要模板参数列表“;STL容器内部

C++ MSVC:“;使用类模板需要模板参数列表“;STL容器内部,c++,templates,visual-c++,gcc,stl,C++,Templates,Visual C++,Gcc,Stl,我对MSVC 12和GCC 4.8上的嵌套模板类有问题。我已将其缩减为以下片段: #include <vector> #include <list> template <typename A, typename B> struct Base { template <typename A2, typename B2> struct InBase { }; }; template <typename A, typename B> s

我对MSVC 12和GCC 4.8上的嵌套模板类有问题。我已将其缩减为以下片段:

#include <vector>
#include <list>

template <typename A, typename B>
struct Base
{
  template <typename A2, typename B2> struct InBase { };
};

template <typename A, typename B>
struct Derived : public Base<A, B>
{
  typedef Base<A, B> MyBase;

  // this works on GCC 4.8
  typedef typename MyBase::template InBase<A, B> MyInBase;
  // this works on MSVC 12
  typedef MyBase::InBase<A, B> MyInBase;

  typedef std::vector<MyInBase*> MyInBaseVector;
  typedef std::list<MyInBase*> MyInBaseList;

  MyInBaseList list;
};

MSVC错误是否正确?如果是,我如何修复它?

MSVC拒绝这里的有效代码,如14.2(临时名称)p4所述:

当成员模板专用化的名称出现在 后缀表达式或在限定id中的嵌套名称说明符之后,以及 后缀表达式的对象表达式依赖于类型或 限定id中的嵌套名称说明符引用依赖类型,但名称 不是当前实例化(14.6.2.1)的成员,成员模板名称必须 前缀为关键字
模板
。否则,该名称将假定为一个名称 非模板

有鉴于此,我检查了您的样本与ICC 13和Clang 3.3的对比:ICC正确地以
nontype”为基础拒绝了此MSVC ism。但要解决它,您只需使用
\ifdef\u MSC\u VER
块来固定特定于MSVC的typedef版本


《学究》:国际刑事法院,在世界上某些角落,它的做法与C++标准完全一致,因为它使用了与C++相同的EDG前端。

我想“代码> Type f Type NeXBy:MyBase::InBase MyInBase < /Cord> @ NeilKirk:尝试了,适用于MSVC,但GCC仍然要求<代码>模板<代码>关键字。与以前大致相同。您需要
typename
template
。MSVC只是不符合要求。感谢您的详细分析。我目前的解决方法是使用一个结构来包装指针,然后将该结构放入向量中,而不使用ifdef。
deptypes.cpp(20) : error C2955: 'Base<A,B>::InBase' : use of class template requires template argument list
    deptypes.cpp(7) : see declaration of 'Base<A,B>::InBase'
    deptypes.cpp(24) : see reference to class template instantiation 'Derived<A,B>' being compiled
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE\vector(648) : error C2955: 'Base<A,B>::InBase' : use of class template requires template argument list
    deptypes.cpp(7) : see declaration of 'Base<A,B>::InBase'
    deptypes.cpp(7) : see declaration of 'Base<A,B>::InBase'
deptypes.cpp(21) : error C2955: 'Base<A,B>::InBase' : use of class template requires template argument list
    deptypes.cpp(7) : see declaration of 'Base<A,B>::InBase'
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE\list(859) : error C2955: 'Base<A,B>::InBase' : use of class template requires template argument list
    deptypes.cpp(7) : see declaration of 'Base<A,B>::InBase'
    deptypes.cpp(7) : see declaration of 'Base<A,B>::InBase'