模板并返回一个节点*
我正在使用模板类型为键,数据和比较函数制作BST类。我有一个函数创建新的节点并返回一个指向其他函数的指针。问题是,使用模板时返回类型无效。我创建了以前没有模板的树,并返回一个类型节点*不是问题。我不确定幕后发生的事情是否使模板版本无效。 我得到的错误包括:模板并返回一个节点*
面目全非模板声明/定义
语法错误:缺少“;”之前'*'
缺少类型说明符 - int假定。注意:C++不支持默认int
我的类模板,节点结构和节点创建功能如下:
template <typename KEY, typename VALUE, bool (*COMPARE)(KEY, KEY)>
class BSTROOT {
private:
struct Node {
KEY key;
VALUE value;
Node *left = nullptr;
Node *right = nullptr;
};
Node* createNode(const KEY& key, const VALUE& value);
template <typename KEY, typename VALUE, bool(*COMPARE)(KEY, KEY)> Node* BSTROOT<KEY, VALUE, COMPARE>::createNode(const KEY& key, const VALUE& value) {
Node *temp = new Node;
temp->key = key;
temp->value = value;
return temp;
}
任何提示或信息,将不胜感激。
这里的问题是Node*
类型嵌套在BSTROOT
类型的内部,因此您需要明确指出在实现中从函数中写入返回值的类型时。这将是这个样子:
template <typename KEY, typename VALUE, bool(*COMPARE)(KEY, KEY)>
typename BSTROOT<KEY, VALUE, COMPARE>::Node*
BSTROOT<KEY, VALUE, COMPARE>::createNode(const KEY& key, const VALUE& value) {
Node *temp = new Node;
temp->key = key;
temp->value = value;
return temp;
}
这里,额外typename
关键字是必要的,因为Node
是什么叫做依赖型(嵌套内在的东西,取决于模板参数类型)。
您不需要将该长名称放在类的正文中,因为在该上下文中编译器已知道要查看BSTROOT
的内部。尽管如此,编译器无法告诉您希望它查看嵌套的Node
类型,而不是其他一些名为Node
的全局类型。
这解决了这个问题。谢谢您的帮助。 – odoylerules
我认为这将有助于
template <typename KEY, typename VALUE, bool(*COMPARE)(KEY, KEY)>
struct Node {
KEY key;
VALUE value;
Node *left = nullptr;
Node *right = nullptr;
};
template <typename KEY, typename VALUE, bool(*COMPARE)(KEY, KEY)>
class BSTROOT {
private:
Node* createNode(const KEY& key, const VALUE& value);
};
template<typename KEY, typename VALUE, bool(*COMPARE)(KEY, KEY)>
Node * BSTROOT<KEY, VALUE, COMPARE>::createNode(const KEY & key, const VALUE & value)
{
Node *temp = new Node;
temp->key = key;
temp->value = value;
return temp;
}
这段代码不会编译 - 你需要指定'Node'类型的模板参数。此外,这暴露了'Node'类型的内部实现,它打破了当前系统的封装。虽然也许有一个我缺少的优势? – templatetypedef
你关闭与'}类定义;'? – Cornstalks
请提供一个[最小,完整和可验证的示例](https://stackoverflow.com/help/mcve) – klutt
我所有的{}都很好,我没有直接复制所有代码的粘贴我认为相关的位。我想我不应该把大量的代码转储到页面上。我第一次在这里问一个问题,所以原谅我,如果我不这样做通常预期 – odoylerules