0
namespace chk{

class Car;
        Car abc()
        {
                return Car();
        }

class Car
{
        private:
                int sides;

        public:
                Car()
                {
                        std::cout<<"\ndefault called constructor";
                }
                Car(int nsides)
                {
                        std::cout<<"\ncalled constructor";
                        sides=nsides;
                }

                ~Car()
                {

                        std::cout<<"\nDeleting objext";
                }

};

       /* Car abc()
        {
                return Car();
        }*/
}

我收到上述代码的以下错误:-

check.cpp: In function ‘chk::Car chk::abc()’:
check.cpp:25: error: return type ‘struct chk::Car’ is incomplete
check.cpp:27: error: invalid use of incomplete type ‘struct chk::Car’
check.cpp:24: error: forward declaration of ‘struct chk::Car’


现在,当取消注释下面的 abc() 并在 abc() 上面注释时,它可以正常工作。为什么 c++ 不允许我在命名空间内转发声明类?

4

2 回答 2

1

为什么 c++ 不允许我在命名空间内转发声明类?

C ++不允许的是具有诸如

Car abc()
{
    return Car();
}

没有 classCar的定义。这是必需的,因为 a) 需要Car对象的大小,并且 b) 调用了类的默认构造函数。没有类定义,就无法知道构造函数是否存在。

于 2013-06-22T18:14:04.473 回答
1

问题是您的 abc() 函数需要 Car 的完整定义。

Car abc() { return Car(); }

尤其是这里要求它必须知道定义,以便它可以确定它将解析到哪个构造函数。

前向声明仅涵盖需要指针或类型引用的情况,不涵盖需要解析内部细节的情况。

确定使用哪个构造函数是一个内部细节。此外,编译器还需要知道“汽车”对象将有多大,以便在您按值返回时返回一个。

解决这个问题的一种方法是转发声明函数:

class Car abc();

class Car { ... };

Car abc() { return Car(); }
于 2013-06-22T18:14:13.897 回答