gpt4 book ai didi

C++类拷贝构造函数没有匹配函数

转载 作者:搜寻专家 更新时间:2023-10-31 00:56:59 27 4
gpt4 key购买 nike

我正在尝试写一个Core类,它的成员变量是一个指针。复制构造函数是 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: In function ‘int main()’:

main.cpp:30:37: error: no matching function for call to ‘Core::Core(Core)’

Core new_core= core.new_core(ptr);
^

main.cpp:30:37: note: candidates are:

main.cpp:12:6: note: Core::Core(Core&)

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

main.cpp:12:6: note: no known conversion for argument 1 from ‘Core’ to >‘Core&’

main.cpp:10:6: note: Core::Core(int*)

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

main.cpp:10:6: note: no known conversion for argument 1 from ‘Core’ to ‘int*’

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

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

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

有没有不用const_cast就能解决问题的更好方法?

我想保持 int* a 私有(private),并保持以下两行:

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

谢谢。

最佳答案

这里的问题是 new_core 返回一个临时的 Core。当你使用它时

Core new_core= core.new_core(ptr);

编译器调用复制构造函数,但它不能绑定(bind)到那个临时对象,因为它需要一个引用。要解决此问题,我们可以更改复制构造函数以采用 const Core&,它可以绑定(bind)到临时对象并允许您进行复制。

在这个例子中,为了避开 constconst_cast 的使用,我们可以像这样直接访问类成员:

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

关于C++类拷贝构造函数没有匹配函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38314670/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com