我有三个班级:
//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
来取一个模板类,它不允许默认构造函数作为参数。
我是否需要在此处实施模板模板参数?
答案 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>
是类,您可以通过实例化类模板获得它们。有些人也会将这些类称为模板类。