2017-01-04 5 views
2

Я хотел бы создать функцию, которая создает различные типы генераторов (собственные классы) и я иду с чем-то вроде этого:шаблон C++ функция, возвращающий типа на основе аргументов шаблона

template <typename Iterator> 
class Generator { 
Iterator begin_; 
Iterator end_; 
public: 
Generator(Iterator begin, Iterator end) 
    : begin_(begin) 
    , end_(end) 
    {} 
}; 

template <typename GeneratorType, typename ContainerIterator> 
GeneratorType<ContainerIterator> make_generator(ContainerIterator begin, ContainerIterator end){ // Error occurs here 
    return GeneratorType<ContainerIterator>(std::forward<ContainerIterator>(begin), std::forward<ContainerIterator>(end)); 
} 

Но это не компиляции, так как ошибки :

error: 'GeneratorType' is not a template (in line GeneratorType<ContainerIterator> make_generator...) 

Кто-нибудь знает, если это возможно, и если да, то как это исправить?

ответ

3

Изменение make_generator «s определение

template <template<class> class GeneratorType, typename ContainerIterator> 
GeneratorType<ContainerIterator> make_generator(ContainerIterator begin, ContainerIterator end) 

Вы можете передавать шаблоны в качестве параметров других шаблонов. Но определение параметра должно быть указано как ожидающее шаблон-шаблон шаблона.

1

Как говорится в сообщении об ошибке, GeneratorType - это тип, а не шаблон. Вам нужно сделать шаблон шаблона шаблона, используя синтаксис template <typename> class:

template <template <typename> class GeneratorType, typename ContainerIterator> 
GeneratorType<ContainerIterator> 
make_generator(ContainerIterator begin, ContainerIterator end){ 
    return GeneratorType<ContainerIterator> 
      (std::forward<ContainerIterator>(begin), 
       std::forward<ContainerIterator>(end)); 
} 
Смежные вопросы