Следующий код
template<template<typename, typename> class T, typename EKeyType, typename EValueType>
class Baseclass
{
};
template<typename EKeyType, typename EValueType>
class Derived : public Baseclass<Derived, EKeyType, EValueType>
{
public:
void foo(const Baseclass<Derived, EKeyType, EValueType>& param){}
};
приводит к следующим ошибкам компиляции:
MSVC 14: error C3200: 'Derived<EKeyType,EValueType>': invalid template argument for template parameter 'T', expected a class template
clang 3.0.0: error: template argument for template template parameter must be a class template.
Однако Derived
- это шаблон класса.
Все отлично компилируется, когда я меняю код на следующее:
template<template<typename, typename> class T, typename EKeyType, typename EValueType>
class Baseclass
{
};
template<typename EKeyType, typename EValueType> class Derived;
template<typename EKeyType, typename EValueType>
class Derived2 : public Baseclass<Derived, EKeyType, EValueType>
{
public:
void foo(const Baseclass<Derived, EKeyType, EValueType>& param){}
};
, что указывает на то, что сообщение об ошибке вводит в заблуждение.
Что не так с первым кодом?
Как получить подкласс шаблона, наследуемый от базового класса шаблона, при этом подкласс является аргументом шаблона шаблона базового класса, а также иметь функцию-член в подклассе, которая принимает ссылку на этот базовый класс в качестве параметра?