我有一个类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
,但带有一个参数“ currying”(A
)我该怎么做?
这是我的(not working)解决方案:
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
> {};
哪个给我错误:
模板模板参数的template参数必须是类模板或类型别名模板
答案 0 :(得分:2)
模板Base
期望模板作为第一个参数,但是您尝试传递从属类型(由typename
表示),因此出现错误消息。此外,Result
中的嵌套别名BindFirst
是模板,因此需要与typename
一起使用的模板参数。所以代替
typename BindFirst<Foo, A>::Result
您必须使用
告诉编译器Result
实际上是模板
BindFirst<Foo, A>::template Result