У меня есть три класса:
//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
чтобы взять класс шаблона, который не допускайте конструктор по умолчанию в качестве аргумента.
Нужно ли мне здесь применять шаблонный шаблон?
У вас есть ошибка копирования и вставки, которую вы должны обнаружить из сообщения об ошибке:
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>
- это классы, которые вы получаете путем создания экземпляра шаблона класса. Некоторые люди также назвали бы класс классов классов.