【问题标题】:overloading a member function of a template class重载模板类的成员函数
【发布时间】: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类型匹配TreeNodeNODETYPE吗? IE。不应该是template&lt;&gt; void Tree&lt;char*&gt;::insertNodeHelper(TreeNode&lt;char*&gt;**ptr, const char *value)之类的吗?
  • 我也试过 Petr 。它不起作用,因为它不承认友谊,而且我无法访问 TreeNode 的私有值。

标签: c++ function templates overloading


【解决方案1】:

我意识到我的错误。模板类中使用类模板参数的函数不是模板函数!考虑一下:

template<typename TYPE>
class foo
{
void f1(U);
void f1(char);
}

如果您认为 f1(char) 用于 char 值,那您就错了! 当你声明foo&lt;char&gt; 时,编译器会生成这样的代码:

class foo
{
void f1(char);
void f1(char);
}

有一种简单的方法可以重载 f1。像这样:

template<typename TYPE>
class foo
{
template<typename I>
void f1(I);

void f1(char);
}

所以在这种情况下没有重复的函数,模板 f1 也创建了一个适当的函数,但是编译器在模板函数之前调用普通函数。

【讨论】:

  • 那么,你真的是说overload resolution 现在仍然按预期工作吗?
  • 不,我知道重载解决方案,这不是问题。重点是考虑将带有模板参数的函数作为模板函数,因为它会随着类型的变化而变化。我在这里看到了同样的问题,但我无法理解这一点,这就是我自己写答案的原因
  • 查看第一条评论中的链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-01
  • 2013-09-22
  • 1970-01-01
  • 2015-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多