缺失的部分在哪里?或者反过来说,这里有什么问题?我仍然是C++新手,这样的事情很难谷歌和搜索。
template <typename T>
struct ExTree{
T tensor;
ExTree* left, *right;
};
template <typename T>
ExTree* newExTree<T>(T tensor){
ExTree *e = new ExTree<T>();
e->left = e->right = NULL;
e->tensor = tensor;
return e;
}
这是错误消息:
In file included from main.cpp:5:0:
expression.hpp:47:1: error: invalid use of template-name ‘ExTree’ without an argument list
ExTree* newExTree<T>(T tensor){
编辑:我发现了错误,但它背后的原因仍然让我难以理解,所以我的问题仍然有效。我希望这不是简单的^^
正确的语法是:
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 规则)。
此外,您不应像以前那样在函数名称后重复模板参数。这是在模板的专用化中完成的,而不是在其初始声明中完成的。例如,如果你想专门为T = int
专门newExTree
,你会写
template<> ExTree<int>* newExTree<int>(int x) {
// ...
}