重新出现错误果实f与果实(f)

时间:2014-12-18 15:30:58

标签: c++

class fruit{
  public:
       fruit(){  }
       fruit(int a){ cout << "int"; }
       fruit(const fruit& f){ cout << "fruit"; }
};
class apple{
    public: apple(){ }
            apple(fruit f){ }
};
int main(){
   fruit f;
   int a;
   fruit(f); // redclaration error ? why
   fruit(a); // invokes fruit(int) constructor
   fruit(fruit()); // invokes fruit(const fruit& f) function
   apple(f); // redeclaration error. why
}

我希望fruit(f)执行fruit(const fruit& f),但是生成重新声明错误,这是解析问题吗?

我只是尝试将f作为参数传递给apple构造函数,但它会生成重新声明错误。 可以解释一下为什么吗?

3 个答案:

答案 0 :(得分:3)

这里的问题是你有

fruit f;

其中声明了f类型的变量fruit,然后你有:

fruit(f);//same as: fruit f;

这不是使用参数f创建新水果,而是创建f类型的变量fruit,这可能不是您所期望的。这是另一个分配给f的变量,它给出了重新声明的错误。

apple(f);// same as: apple f;

您再次尝试在此处重新声明变量f

如果您想要初始化而不是新变量,请使用新的统一初始化语法。引入此语法的目的是消除这种歧义,因此请改用:

fruit{f};

初始化和声明之间的这种模糊性有时被称为c ++&#39; s "most vexing parse"。新的统一初始化列表语法更符合您的意图,因为它明确地说&#34;这是初始化而不是声明&#34;。 有关何时使用此语法的详细信息,请参阅this question

同样在您的示例中,您在课程后缺少分号,您想要修复它。

答案 1 :(得分:3)

fruit(f); // redclaration error ? why

因为它等同于声明fruit f; - 如果你愿意,你可以在声明中的名称周围添加括号。在这个范围内已经声明了f,所以这是一个错误。

fruit(a); // invokes fruit(int) constructor

不,不。同样,这相当于fruit a;,并且再次失败,因为已经有a

fruit(fruit()) // invokes fruit(const fruit& f) function

不,不。缺少;,这相当于fruit fruit();并声明一个函数(在周围的命名空间中)。

apple(f); // redeclaration error. why

与前两个声明的原因完全相同。

答案 2 :(得分:2)

fruit(f); 

完全相同
fruit f; 

但是您已经宣布了一个名为f的内容(另一个fruit。)您已经声明了f两次。这就是你得到重新声明错误的原因。沿着同样的路线,这个

apple(f);

完全相同
apple f;

所以,你再次重新声明f。如果您想从apple创建f,则需要

apple x(f);