为什么我不能称之为'显式C(const C&)'?

时间:2011-02-21 22:24:45

标签: c++

Heres the link to code and the error

我不明白为什么行return (const C&)cc;无效。

下载了一段代码和错误

#include <stdio.h>

class C 
{
public:
    int i;
    explicit C(const C&)   // an explicit copy constructor
    {
        printf("\nin the copy constructor");
    }
    explicit C(int i )   // an explicit constructor
    {
        printf("\nin the constructor");
    }

    C()
    {
        i = 0;
    }
};

class C2
{
public:
    int i;
    explicit C2(int i )   // an explicit constructor
    {
    } 
};

C f(C c)
{   // C2558
//    c.i = 2;
//    return c;   // first call to copy constructor
C cc;
return (const C&)cc;
}

void f2(C2)
{
}

void g(int i)
{
//    f2(i);   // C2558
    // try the following line instead
     f2(C2(i));
}

int main()
{
    C c, d;
    d = f(c);   // c is copied
}

输出:

  

在函数'C f(C)'中:第36行:错误:   没有匹配的呼叫功能   'C :: C(const C&amp;)'编译   由于-Wfatal-errors而被终止。

3 个答案:

答案 0 :(得分:2)

第36行需要复制构造函数的隐式调用,由于某种原因,您已声明了该构造函数。 删除副本上的显式,你会没事的。 将它放在C::C(int)上是有意义的。

答案 1 :(得分:1)

调用显式复制构造函数的示例:

当然,按值传递和按值返回总是隐式调用复制构造函数,因此明确声明复制构造函数会阻止这种情况(不一定是坏事)。

答案 2 :(得分:0)

尝试:

return C(cc);

这是对复制构造函数的显式调用。铸造参考不是。