我被賦予了一項在新平臺上編譯C 遺留代碼的任務。在編譯的程序中,我遇到了以下代碼......
class GLOBALS
{
public:
static GLOBALS _global;
};
GLOBALS GLOBALS::_global;
class DEF
{
public:
GLOBALS::GLOBALS _global。
};
當我試圖編譯這段代碼時,我得到了以下錯誤......
error: 'GLOBALS::GLOBALS' names the constructor, not the type
GLOBALS::GLOBALS _global。
我不明白這段代碼想要達到什么目的。有誰能給我指點一下嗎?以及他們之前是如何編譯這段代碼的?
uj5u.com熱心網友回復:
這段代碼似乎試圖只對自己有一個參考。GLOBALS::GLOBALS沒有任何意義,除非這個類被隱藏在另一個額外的命名空間GLOBALS之后。這可能只是這個遺留代碼中的一個錯誤。
class GLOBALS
{
public:
static GLOBALS _global;
int dummy = 0;
};
GLOBALS GLOBALS::_global;
class DEF
{
public:
GLOBALS _global。
};
int main()
{
DEF x;
x._global._global._global._global._global._global.dummy = 1;
}
這一行GLOBALS GLOBALS::_global;建立了一個基本情況。所以現在我們可以在_global._global._global... GLOBALS物件內訪問一個dummy變數。
uj5u.com熱心網友回復:
看起來這與注入類名的概念有關
只要類內的類名本身是公開的,我們就能寫出這樣的東西
std::vector<int> ::vector a。
這就推匯出了std::vector<int>,因為你可以在vector類里面寫vector。
class Test
{
public:
測驗一些東西。
.....
.....
typedef some_type 型別。
.....
};
當我們寫Test::Type時,我們知道我們指的是some_type,而當我們寫Test::Test時,型別名Test在class Test里面是公開的,這就推匯出它只是Test。
我們可以想寫多少就寫多少
。
template<class T, class U>
結構 is_same
{
static const bool value=false;
};
template<class T>
struct is_same<T,T>
{
static const bool value=true;
};
int main(){
static_assert(is_same<Test::Test::Test, Test> ::value)。
}
而且這很奇怪,這在gcc 4.4.7中可以編譯;
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/314163.html
標籤:
