претоварване на членска функция на шаблонен клас

Имам шаблонен клас като Tree, който вмъква стойност в шаблонен клас NodeTree. Tree е приятел на 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

Знам, че когато имате шаблонна функция и претоварена обикновена, когато компилаторът търси правилна функция, той ще избере обикновената за конкретния тип. но тук не го прави. как да реализираме успешно претоварване?


person shayan    schedule 03.12.2015    source източник
comment
Как се декларира insertNodeHelper?   -  person TartanLlama    schedule 03.12.2015
comment
Не трябва ли типът value да съответства на NODETYPE на TreeNode? т.е. не трябва ли да е нещо като template<> void Tree<char*>::insertNodeHelper(TreeNode<char*>**ptr, const char *value)?   -  person Petr    schedule 03.12.2015
comment
И аз го пробвах Петр. не работи, защото не разпознава приятелството и не мога да получа достъп до личните стойности на TreeNode.   -  person shayan    schedule 03.12.2015


Отговори (1)


Осъзнах грешката си. функция в шаблонен клас, която използва шаблонен параметър на класове, не е шаблонна функция! помислете за това:

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

ако мислите, че f1(char) се използва за стойности на char, грешите! когато декларирате foo<char> компилатор, генерирайте код като този:

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

има прост начин за претоварване на f1. като този :

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

void f1(char);
}

така че в този случай няма дублирана функция, също шаблонът f1 създава правилна функция, но компилаторът извиква обикновени функции преди шаблонни.

person shayan    schedule 03.12.2015
comment
И така, наистина ли искате да кажете, че разрешаването на претоварване все още работи според очакванията днес? - person skypjack; 04.12.2015
comment
Не, знам разделителната способност на претоварване, това не е проблемът. Въпросът беше разглеждането на функция с шаблонен аргумент като шаблонна функция, защото тя се променя с промяната на типа. Видях същите проблеми тук, но не можах да получа тази точка, затова написах отговора сам - person shayan; 04.12.2015
comment
Вижте линка в първия коментар. - person skypjack; 04.12.2015