2

请查看此程序及其产生的错误:

#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]

你能帮我找出问题吗?谢谢你

4

2 回答 2

6

你的“B b2();” 是 C++ 的“令人头疼的解析”问题(参见此处——“最令人头疼的解析”进一步使用了模棱两可的语法)。

它看起来 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;

有关更多信息,请参阅:

于 2013-03-14T06:18:04.150 回答
2
B b2();

它是函数声明,而不是变量声明!

函数名b2不带参数,返回类型为 的对象B

在 C++ 中搜索令人烦恼的解析。

于 2013-03-14T06:17:37.717 回答