I have a template template function CreateClassA that is meant to work with ClassA. I would like to declare CreateClassA like this:
template<typename T, template<typename, typename> class Container, typename alloc = std::allocator<T>>
std::shared_ptr<ClassA<T, Container, alloc>> CreateClassA(size_t size, double dist) {
return std::make_shared<ClassA<T, Container, alloc>>(size, dist);
};
And then call it like this:
size_t size = 5;
std::shared_ptr<ClassA<ObjectB, std::vector>> classA2 = CreateClassA(size, 4.5);
For some reason though, the compiler cannot deduce the template argument types, unless I declare CreateClassA like this:
template<typename T, template<typename, typename> class Container, typename alloc = std::allocator<T>>
std::shared_ptr<ClassA<T, Container, alloc>> CreateClassA(ClassA<T,Container, alloc> classA, size_t size, double dist) {
return std::make_shared<ClassA<T, Container, alloc>>(size, dist);
};
and call the function like this:
size_t size = 5;
ClassA<ObjectB,std::vector> classA(size,5);
std::shared_ptr<ClassA<ObjectB, std::vector>> classA2 = CreateClassA(classA, size, 4.5);
I don't get why the function cannot deduce the template arguments in the first function implementation and why the classA argument is necessary.