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构造函数,但它会生成重新声明错误。
可以解释一下为什么吗?
答案 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);