у меня урок Foo
, который имеет два параметра шаблона, A
а также B
:
template<typename A, typename B>
struct Foo {};
Также у меня есть класс Base
, который имеет один параметр шаблона шаблона:
template<template<typename B> typename Foo>
struct Base {};
Я хочу написать класс Derived
предполагая следующее:
Derived
имеет один параметр шаблона (A
)Derived
расширяет класс Base
Derived
передает в качестве параметра шаблона класс Base
учебный класс Foo
, но с одним параметром «curry» (A
)Как я могу это сделать?
Вот мой (не работает) решение:
template<template<typename B> typename Foo>
struct Base {};
template<typename A, typename B>
struct Foo {};
template<template<typename A, typename B> typename Foo, typename A>
struct BindFirst {
template<typename B>
using Result = Foo<A, B>;
};
template<typename A>
struct Derived : Base<
// error is here
typename BindFirst<Foo, A>::Result
> {};
Что дает мне ошибку:
Аргумент шаблона для параметра шаблона должен быть шаблоном класса или псевдонимом типа
Шаблон Base
ожидает шаблон в качестве первого параметра, но вы пытаетесь передать зависимый тип (обозначенный как typename
), отсюда и сообщение об ошибке. Более того, вложенный псевдоним Result
внутри BindFirst
является шаблоном и поэтому требует использования параметра шаблона для использования с typename
, Так что вместо
typename BindFirst<Foo, A>::Result
Вы должны сказать компилятору, что Result
на самом деле шаблон, используя
BindFirst<Foo, A>::template Result
Других решений пока нет …