【发布时间】:2015-12-03 12:27:15
【问题描述】:
我有一个作为 Tree 的模板类,它向模板类 NodeTree 插入一个值。树是 NodeTree 的朋友。我向 NodeTree 插入值的函数是:
template<typename NODETYPE>
void Tree<NODETYPE>::insertNode(const NODETYPE &value)
{
insertNodeHelper(&rootPtr, value);
}
insertNodeHelper 是实用函数。我希望我的 insertNodeHelper 对 const string * 表现不同。我首先想到的是超载它。 类中的声明:
template<typename NODETYPE>
class Tree
{
public:
Tree();
void insertNode(const NODETYPE &);
private:
TreeNode<NODETYPE>*rootPtr;
void insertNodeHelper(TreeNode<NODETYPE> **, const NODETYPE &);
void insertNodeHelper(TreeNode<NODETYPE> **, const char *);
};
定义:
template<class NODETYPE>
void Tree<NODETYPE>::insertNodeHelper(TreeNode<NODETYPE>**ptr,
const char *value)
{
if (*ptr == 0)
*ptr = new TreeNode<const char *>(value);
else
{
if (strcmp(value, (*ptr)->data) < 0)
insertNodeHelper(&((*ptr)->leftPtr), value);
else if (strcmp(value, (*ptr)->data) >= 0)
insertNodeHelper(&((*ptr)->rightPtr), value);
}
}
template<typename NODETYPE>
void Tree<NODETYPE>::insertNodeHelper(
TreeNode<NODETYPE>**ptr, const NODETYPE &value)
{
if (*ptr == 0)
*ptr = new TreeNode<NODETYPE>(value);
else
{
if (value < (*ptr)->data)
insertNodeHelper(&((*ptr)->leftPtr), value);
else if (value >= (*ptr)->data)
insertNodeHelper(&((*ptr)->rightPtr), value);
}
}
但我得到这个错误:
1>c:\users\shayan\documents\visual studio 2013\projects\fig21.20\fig21.20\tree.h(54): error C2244: 'Tree<NODETYPE>::insertNodeHelper' : unable to match function definition to an existing declaration
我知道当你有一个模板函数和一个重载的普通函数时,编译器在寻找合适的函数时,它会为特定类型选择普通函数。但在这里它没有这样做。如何实现成功的重载?
【问题讨论】:
-
你如何声明
insertNodeHelper? -
不应该
value类型匹配TreeNode的NODETYPE吗? IE。不应该是template<> void Tree<char*>::insertNodeHelper(TreeNode<char*>**ptr, const char *value)之类的吗? -
我也试过 Petr 。它不起作用,因为它不承认友谊,而且我无法访问 TreeNode 的私有值。
标签: c++ function templates overloading