使用模板参数实例化模板类

时间:2013-11-20 13:58:18

标签: c++ templates instantiation

我有三个班级:

//Template class for function 1
template<class P> class wrap4{
    P p;

public:
    wrap4(P&& p1) : p(std::forward<P>(p1)) {}

    double f(double x){
        return p.FN(x);
    }

};

//Simple concrete parameter
struct Parameter{
    double FN(double x){
        return x;
    }

};

//Method used in the program
template<class Function> class B {
    Function F;
public:
    B(Function && f) : F(std::forward<Function>(f)) {}
    double use(double x){
        return F.f(x);
    }
}; 

template<class Function> B<Function> make_B(Function && F){ return B<Function>{std::forward<Function>(F)}; }
template<class P> B<P> make_wrap4(P && F){ return B<P>{std::forward<P>(F)}; }

基本上,我想将wrap4插入B,但为此我必须使用Parameter对其进行实例化。我尝试了以下内容:

auto A = make_B(make_wrap4{Parameter p});

但这不起作用,我得到了编译器错误

error: conversion from 'B<B<Parameter> >' to non-scalar type 'B<wrap4<Parameter> >' requested

当然,这是一个愚蠢的例子,因为我知道我可以用B实现Parameter,但当然我正在尝试做一些更复杂的事情,从长远来看,我真的需要一个B来取一个模板类,它不允许默认构造函数作为参数。

我是否需要在此处实施模板模板参数?

1 个答案:

答案 0 :(得分:1)

您可以从错误消息中找到一个复制和粘贴错误:

template<class P> B<P> make_wrap4(P && F){ return B<P>{std::forward<P>(F)}; }

应该是

template<class P> wrap4<P> make_wrap4(P && F){ return wrap4<P>{std::forward<P>(F)}; }
//                ^^ here                             ^^ and here

然后你应该像函数一样调用make_wrap4,即没有初始化列表。


一点注意事项:你没有三个课程,你有一个课程和两个课程模板。它也不是模板类,因为wrap4的注释状态。

  • wrap4类模板
  • wrap4<int>wrap4<Parameter>,您可以通过实例化类模板获得它们。有些人也会将这些类称为模板类