簡體   English   中英

foward在命名空間中聲明類拋出編譯器錯誤

[英]foward declaring class in namespace throwing compiler error

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”對象的大小,以便在按值返回時返回一個“Car”對象。

解決這個問題的一種方法是轉發聲明函數:

class Car abc();

class Car { ... };

Car abc() { return Car(); }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM