2017-12-02 54 views
0

我正在使用模板类型为键,数据和比较函数制作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; 
} 

任何提示或信息,将不胜感激。

+0

你关闭与'}类定义;'? – Cornstalks

+0

请提供一个[最小,完整和可验证的示例](https://stackoverflow.com/help/mcve) – klutt

+0

我所有的{}都很好,我没有直接复制所有代码的粘贴我认为相关的位。我想我不应该把大量的代码转储到页面上。我第一次在这里问一个问题,所以原谅我,如果我不这样做通常预期 – odoylerules

回答

1

这里的问题是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的全局类型。

+0

这解决了这个问题。谢谢您的帮助。 – odoylerules

0

我认为这将有助于

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; 
} 
+0

这段代码不会编译 - 你需要指定'Node'类型的模板参数。此外,这暴露了'Node'类型的内部实现,它打破了当前系统的封装。虽然也许有一个我缺少的优势? – templatetypedef