[英]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.