C++ 部分定义/别名模板参数

C++ 部分定义/别名模板参数,c++,c++11,templates,crtp,C++,C++11,Templates,Crtp,我试图在模板化派生类中使用CRTP和template-template参数,并在传递给基类以完全定义之前指定它的一些参数,但不是全部参数。我可以将其与模板化别名进行比较的最接近的概念,但由于它必须全部位于类定义的一行顶部,我不确定如何实现这一点。希望一个例子能让它更清楚一点 以下是我目前的代码: template<template<typename> class Template1, typename Param1> class Base { public: us

我试图在模板化派生类中使用CRTP和template-template参数,并在传递给基类以完全定义之前指定它的一些参数,但不是全部参数。我可以将其与模板化别名进行比较的最接近的概念,但由于它必须全部位于类定义的一行顶部,我不确定如何实现这一点。希望一个例子能让它更清楚一点

以下是我目前的代码:

template<template<typename> class Template1, typename Param1>
class Base
{
public:
    using type = Param1;
};

template<template<typename, typename> class Template1, typename Param1, typename Param2>
class Derived : public Base<template<typename P1> class Template1<P1, Param2>, Param1>
{};

template<typename Param1, typename Param2>
class Template1
{};

int main()
{
  Derived<Template1, int, double>::type d = 0;
}
模板
阶级基础
{
公众:
使用类型=Param1;
};
模板
派生类:公共基
{};
模板
类模板1
{};
int main()
{
派生::类型d=0;
}
此操作当前失败,原因如下:

9:89:错误:模板参数的数量错误(1,应该是2) 2:7:错误:为“模板类基类”提供 在函数“int main()”中: 18:3:错误:“类型”不是“派生”的成员

这个错误消息真正让我困惑的是,我看不到我只指定了一个模板参数的地方。我还发现,如果我按以下方式定义派生,那么它的编译效果很好:

template<typename> class Test {};

template<template<typename, typename> class Template1, typename Param1, typename Param2>
class Derived : public Base<Test, Param1>
{};
模板类测试{};
模板
派生类:公共基
{};
我认为这表明问题肯定在这方面(毫不奇怪,这是我不清楚如何实现的一点):

派生类:公共基
基本上,这里我试图用一个参数定义一个新模板,这是第一个模板的两个参数的部分特殊化。我想我做得不对。但是我怎么能在一条线上呢


提前感谢您的帮助。抱歉,如果这在任何方面都不清楚

大概是这样的:

template<template<typename, typename> class TwoParamTemplate, typename Param2>
struct BindSecond {
    template <typename Param1>
    using type = TwoParamTemplate<Param1, Param2>;
};

template<template<typename, typename> class Template1,
         typename Param1, typename Param2>
class Derived : public Base<BindSecond<Template1, Param2>::template type, Param1>
{};
模板
结构绑定秒{
模板
使用type=TwoParamTemplate;
};
模板
派生类:公共基
{};

完美!非常感谢,这正是我需要的。
template<template<typename, typename> class TwoParamTemplate, typename Param2>
struct BindSecond {
    template <typename Param1>
    using type = TwoParamTemplate<Param1, Param2>;
};

template<template<typename, typename> class Template1,
         typename Param1, typename Param2>
class Derived : public Base<BindSecond<Template1, Param2>::template type, Param1>
{};