Создание шаблонных классов с параметрами шаблона

0

У меня есть три класса:

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

Нужно ли мне здесь применять шаблонный шаблон?

Теги:
templates
instantiation

1 ответ

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> - это классы, которые вы получаете путем создания экземпляра шаблона класса. Некоторые люди также назвали бы класс классов классов.
  • 0
    Спасибо! Это была довольно запоздалая ошибка: D Кроме того, спасибо за заметки.
  • 1
    Да, извините за придирки, но бывают случаи, когда такие вещи делают разницу между пониманием и не пониманием проблемы, особенно в SO;)
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню