【发布时间】:2014-09-25 11:18:56
【问题描述】:
我对 MSVC 12 和 GCC 4.8 上的嵌套模板类有疑问。我已将其简化为以下 sn-p:
#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;
};
当我在 GCC 上使用 MyInBase 的 MSVC 变体时,它只是告诉我添加 typename 和 template,我觉得这是可以理解的。当我在 MSVC 上使用 GCC 变体(我相信这是正确的)时,它会报告:
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'
MSVC 错误是否正确?如果是,我该如何解决?
【问题讨论】:
-
我还以为
typedef typename MyBase::InBase<A, B> MyInBase -
@NeilKirk:试过了,适用于 MSVC,但 GCC 仍然要求
template关键字。所以它或多或少和以前一样。 -
您需要
typename和template。 MSVC 只是在那里不合格。
标签: c++ templates visual-c++ gcc stl