请看一下这个程序及其产生的错误:
#include <iostream>
using namespace std;
class A
{
public:
virtual void f(){}
int i;
};
class B : public A
{
public:
B(int i_){i = i_;} //needed
B(){} //needed
void f(){}
};
int main()
{
//these two lines are fixed(needed)
B b;
A & a = b;
//Assignment 1 works
B b1(2);
b = b1;
//But Assignment 2 doesn't works
B b2();
b = b2; // <-- error
}
编译后,我收到以下错误:
$ g++ inher2.cpp
inher2.cpp: In function ‘int main()’:
inher2.cpp:32:10: error: invalid user-defined conversion from ‘B()’ to ‘const B&’ [-fpermissive]
inher2.cpp:14:6: note: candidate is: B::B(int) <near match>
inher2.cpp:14:6: note: no known conversion for argument 1 from ‘B()’ to ‘int’
inher2.cpp:32:10: error: invalid conversion from ‘B (*)()’ to ‘int’ [-fpermissive]
inher2.cpp:14:6: error: initializing argument 1 of ‘B::B(int)’ [-fpermissive]
你能帮我找到问题吗?谢谢
答案 0 :(得分:5)
你的“B b2();”是C ++的“ 烦恼的解析 ”问题(see here - “ 最令人烦恼的解析 ”进一步采用模棱两可的语法。
您希望C ++编译器声明一个函数(预先声明)。
检查出来:
int foo(); //A function named 'foo' that takes zero parameters and returns an int.
B b2(); //A function named 'b2' that takes zero parameters and returns a 'B'.
以后做的时候:
b = b2;
您似乎正在尝试将一个函数( b2 )分配给变量( b )。 要调用一个零参数的构造函数,请在没有括号的情况下调用它,你会没事的:
B b2;
有关详细信息,请参阅:
答案 1 :(得分:2)
B b2();
这是一个函数声明,不是变量声明!
函数名称为b2
,不带参数,返回B
类型的对象。
在C ++中搜索 vexing parse 。