【问题标题】:foward declaring class in namespace throwing compiler error在命名空间中转发声明类引发编译器错误
【发布时间】:2013-06-22 18:03:24
【问题描述】:
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++ 不允许我在命名空间内转发声明类?

【问题讨论】:

  • 它允许你转发声明。问题是abc() 需要类定义。
  • 但是如果我向前声明 class.compiler 应该知道定义在代码中的某处退出。
  • 但它需要的不仅仅是声明。看我的回答。

标签: c++ c++11 namespaces compiler-errors forward-declaration


【解决方案1】:

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

C++不允许有这样的功能

Car abc()
{
    return Car();
}

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

【讨论】:

    【解决方案2】:

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

    Car abc() { return Car(); }
    

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-03-17
      • 2011-04-22
      • 1970-01-01
      • 2013-09-30
      • 2011-12-24
      • 2018-08-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多