类复制构造函数C++没有匹配函数

C++ class copy constructor has no matching function

本文关键字:函数 复制 构造函数 C++      更新时间:2023-10-16

我正在尝试编写一个类核心,它的成员变量是一个指针。复制构造函数是Core(Core& x)而不是Core(const Core& x)

Core有一个成员函数Core Core::new_core (int * ptr),当我尝试构造Core new_core= core.new_core(ptr);时代码有问题,请参阅下面的代码和错误信息。

#include<iostream>
class Core
{
    private:
    int* a;
    public:
    Core(int* in) {a=in;}
    Core(Core& x) {a = x.data();}
    inline const int * data() const {return a;}
    inline       int * data()       {return a;}
    Core new_core (int * ptr)
    {
        Core b(ptr);
        return b;
    }
};
using namespace std;
int main()
{
    int ptr[3]= {1,2,3};
    Core core(ptr);
    Core new_core= core.new_core(ptr);
    cout<< new_core.data() <<endl;
    return 0; 
}

错误信息:

main.cpp:在函数 'int main()' 中:

main.cpp:30:37:错误:调用"核心::核心(核心)"没有匹配函数

Core new_core= core.new_core(ptr);
                                 ^

主.cpp:30:37:注意:候选人是:

主.cpp:12:6: 注意: 核心::核心(核心&)

 Core(Core& x) { a = x.data() ;}
 ^

main.cpp:12:6:注意:参数 1 没有从"核心"到>"核心&"的已知转换

主.cpp:10:6: 注意: 核心::核心(int*)

 Core(int* in) {a=in;}
 ^

main.cpp:10:6:注意:参数 1 没有从"核心"到 "int*"

我可以通过更换轻松解决问题

Core(Core& x) { a = x.data() ;}

Core(const Core& x) { a = const_cast<int* > ( x.data() ) ;}, 

有没有更好的方法可以在不使用const_cast的情况下解决问题?

我想保持int* a的私密性,并遵循以下两行:

inline const int * data() const {return a;}
inline       int * data()       {return a;}

谢谢。

这里的问题是new_core返回一个临时Core。 当您在

Core new_core= core.new_core(ptr);

编译器调用复制构造函数,但它不能绑定到该临时构造函数,因为它需要引用。 为了解决这个问题,我们可以更改复制构造函数以采用可以绑定到临时并允许您制作副本的const Core&

在这个例子中,为了绕过const和使用const_cast我们可以直接访问类成员,如下所示:

Core(const Core& x) : a(x.a) {}