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

Нужно ли мне реализовать шаблон шаблона здесь?

ответ

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 как функция, т.е. не с списком инициализаторов.


Немного Sidenote: вы не имеете три класса, у вас есть один класс и два шаблонов класса. Это также не класс шаблонов , как указано в сообщении для wrap4.

  • wrap4 является шаблонкласса.
  • wrap4<int> и wrap4<Parameter>классы, которые вы получаете путем создания экземпляра шаблона класса. Некоторые люди называли бы такие классы шаблоном класс.
+0

Спасибо! Это была довольно заторможенная ошибка: D Также спасибо за заметки. – Plamen

+1

Да, извините за то, что вы nitpicking, но бывают случаи, когда такие вещи делают разницу между пониманием и непониманием проблемы, особенно на SO;) –

+0

Вы абсолютно правы. Я был честен, когда я сказал спасибо! Я совершенно новичок в шаблонах, которые, как я думаю, блестящие - многие нюансы мне еще неизвестны. – Plamen

Смежные вопросы