ошибка: нет подходящей функции для вызова 'BSTreeNode:: BSTreeNode (int, int, NULL, NULL) '- что не так? - PullRequest
1 голос
/ 25 декабря 2010

ошибка: нет подходящей функции для вызова в BSTreeNode :: BSTreeNode (int, int, NULL, NULL)»

кандидатами являются: BSTreeNode :: BSTreeNode (KF, DT &, BSTreeNode *, BSTreeNode *) [с KF = int, DT = int]

вот как я это использовал:

BSTreeNode<int, int> newNode(5,9, NULL, NULL) ;

Я определил это следующим образом:

BSTreeNode(KF sKey, DT &data, BSTreeNode *lt, BSTreeNode *rt):key(sKey),dataItem(data), left(lt), right(rt){}

что не так с использованием моего конструктора таким образом?

Я всю ночь выдергивал волосы, пожалуйста, помоги мне как можно скорее !!

1 Ответ

1 голос
/ 25 декабря 2010

Неконстантные ссылки не могут быть привязаны к значению r, что вы пытаетесь сделать с аргументом 9 для параметра DT &data.

Вам также потребуетсяпередайте переменную, которая имеет значение 9, или вам потребуется изменить аргумент (и член dataItem, если это ссылка) на тип DT, который копируется по значению в объект.Даже если вы измените ссылку на const, чтобы избавиться от ошибки компилятора, у вас будет проблема с временем жизни передаваемого аргумента, если он временный (он не будет жить после вызова конструктора, поэтомуу вас останется свисающая ссылка).

Вот небольшой пример программы, которая демонстрирует проблему с привязкой константной ссылки в объекте к временному (значение int, возвращаемое из rand()).Обратите внимание, что поведение не определено, поэтому оно может работать в некоторых условиях.Я тестировал эту программу с отладочными сборками на MSVC 2008 и MinGW 4.5.1:

#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>

template <class KF, class DT>
class BSTreeNode {

private:
    KF key;
    DT const& dataItem;
    BSTreeNode* left;
    BSTreeNode* right;

public:
    BSTreeNode(KF sKey, DT const &data, BSTreeNode *lt, BSTreeNode *rt)
        : key(sKey)
        , dataItem(data)
        , left(lt)
        , right(rt)
    {}

    void foo() {
        printf( "BSTreeNode::dataItem == %d\n", dataItem);
    } 
};

BSTreeNode<int, int>* test1()
{
    BSTreeNode<int, int>* p = new BSTreeNode<int, int>(5,rand(), NULL, NULL);

    // note: at this point the reference to whatever `rand()` returned in the
    //  above constructor is no longer valid
    return p;
}


int main()
{
    BSTreeNode<int, int>* p1 = test1();

    p1->foo();

    printf( "some other random number: %d\n", rand());

    p1->foo();
}

Пример выполнения показывает:

BSTreeNode::dataItem == 41
some other random number: 18467
BSTreeNode::dataItem == 2293724
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...