Классы / конструкторы не могут автоматически определять типы, как это делают функции.Вам нужно написать функцию-обертку для создания вашего класса.
Это делается следующим образом и называется шаблоном Object Generator .(спасибо @Itjax!)
template <typename T1, typename T2>
Farm<T1, T2> makeFarm(T1* a, T2* b) {
return Farm<T1,T2>(a,b);
}
// silly example
Farm<T1,T2> farm = makeFarm(a,b);
// better example
template<typename T>
void plow(T& farm) { farm.applyTractor(...); }
void blah() {
plow(makeFarm(b,a))
}
Этот шаблон довольно часто появляется при использовании lambda / bind / foreach и подобных частей, когда вы хотите создать временный объект шаблонного класса с некоторыми аргументами и избежать указанияих тип, обычно отправляющий его в другую шаблонную функцию (std::for_each
) или полиморфный объект (std::function
).
Примечание: Функция генератора обычно встроена и с оптимизацией копирования-тамвероятно, в вашем коде вообще не будет вызываться конструктор копирования.Если вы не можете скопировать свой объект, makeFarm () должна вместо этого возвращать умный указатель (std::unique_ptr
предпочтительнее в современном C ++).