1

我已经阅读了一些关于这个主题的文章,但仍然无法编译我自己的代码。

我有A类:

class A
{
public:
     List<int> data;  
     A(){} 
     A(A&){}
     A& operator= (const A& a)
     {
         // copy the data from a to data  
     }       
};

B 类将调用 A 类:

class B
{
public:
    A makeA()
    {
        A a;
        return a;
    }
    A getA()
    {
        A a = makeA();
        return a;
    }
};

当我在 Linux 下用 g++ 编译我的代码时,我得到了:

没有调用“A::A(A)”的匹配函数。

似乎编译器只是忽略了赋值操作。你能帮我解决这个问题吗?

4

3 回答 3

3

The assignment operator is not used here.

A a = makeA();

This line is an initialization; it uses the copy constructor to copy the value returned by makeA into a. The compiler is complaining because A::A(A&) can't be used with a temporary; change it to the much more common form A(const A&) and things will be much better.

于 2013-07-11T14:50:04.730 回答
3

为了编译它,您的复制构造函数必须通过const引用获取其参数:

A(const A&){}

添加const到您的构造函数签名可以解决这个问题(ideone 上的演示)。

由于您正在定义赋值运算符和复制构造函数,因此您应该强烈考虑添加一个析构函数~A()(请参阅三法则)。

于 2013-07-11T14:47:28.323 回答
0

@彼得是对的。相反,复制构造函数A(A&){}希望成为。A(const A&){}原因是A(A&){}告诉编译器准备修改A传递给复制构造函数的内容,这并没有什么意义,如果A你传递的是临时的,当然也没有意义。

于 2013-07-11T14:57:46.780 回答