这是我的用法:

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){}

以这种方式使用构造函数有什么问题?

我整夜都在拔头发,请尽快帮我!!

最佳答案

非常量引用不能绑定(bind)到右值,这就是您要使用9参数的参数DT &data进行的操作。

您将需要传入一个值为9的变量,或者您需要将参数(如果是引用,则将参数和dataItem成员)更改为DT类型,该类型将通过值复制到对象中。即使您将引用更改为const来消除编译器错误,如果传入的参数是临时的,也将存在传递的参数的生存期问题(不会超出构造函数调用的范围,因此,剩下一个悬挂的参考)。

这是一个小示例程序,演示了将对象中的const引用绑定(bind)到临时对象(从rand()返回的int值)的问题。请注意,该行为是 undefined 的,因此在某些情况下它似乎可以工作。我使用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

关于c++ - 错误:没有匹配函数可调用 ‘BSTreeNode<int, int>::BSTreeNode(int, int, NULL, NULL)’-怎么了?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4529508/

10-16 04:34
查看更多