У меня проблема с вложенными шаблонами классов в MSVC 12 и GCC 4.8. Я уменьшил его до следующего фрагмента кода:MSVC: «использование шаблона класса требует списка аргументов шаблона» внутри контейнеров STL
#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 из MyInBase
на GCC, он просто говорит мне, чтобы добавить typename
и template
, которые я нахожу понятно. Когда я использую вариант GCC на MSVC (который я считаю это правильным), он сообщает об этом:
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 MyInBase' –
@NeilKirk: попробовал, работает для MSVC, но GCC по-прежнему запрашивает ключевое слово' 'template''. Так что это более или менее то же самое, что и раньше. – mooware
Вам нужны как 'typename', так и' template'. MSVC просто несоответствует там. –