Правильный синтаксис:
template <typename T>
ExTree<T>* newExTree(T tensor){
ExTree<T> *e = new ExTree<T>();
e->left = e->right = nullptr;
e->tensor = tensor;
return e;
}
Как говорит вам компилятор, ExTree
- это шаблон, а не тип. Если вы пишете шаблон, это не какой-то «супер-тип» для всех типов, которые вы создаете из него. В основном это просто блок кода, который (ре) создается для каждого типа (или комбинации типов), с которым он создается; это не какая-то объединяющая концепция. Шаблон - это , а не тип, и возвращаемые типы и типы переменных , ну, в общем, типы, поэтому вы должны указать, с какими типами создавать экземпляр шаблона, чтобы получить конкретный тип для использования (игнорирование определенных правил C ++ 14, которые делают вещи более грязными).
Кроме того, вам не следует повторять аргумент шаблона после имени функции, как вы это делали. Это делается в специализации шаблонов, но не в их первоначальном объявлении. Например, если вы хотите специализировать newExTree
для T = int
, вы должны написать
template<> ExTree<int>* newExTree<int>(int x) {
// ...
}