在命名空间中向前声明类引发编译器错误

foward declaring class in namespace throwing compiler error

本文关键字:编译器 错误 声明 命名空间      更新时间:2023-10-16
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++ 不允许我在命名空间内转发声明类?

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

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

Car abc()
{
    return Car();
}

没有类Car的定义。这是必需的,因为 a( 需要 Car 对象的大小,以及 b( 调用类的默认构造函数。如果没有类定义,就无法知道构造函数是否存在。

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

Car abc() { return Car(); }

这里最重要的是要求它必须知道定义,以便它可以确定这将解析为哪个构造函数。

前向声明仅涵盖需要指针或对类型的引用的情况,不包括需要解析内部详细信息的情况。

确定使用哪个构造函数是一个内部细节。此外,编译器还需要知道"Car"对象的大小,以便在按值返回时返回一个对象。

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

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