2011-04-21 77 views
2

我在我的程序做了一個錯誤,我寫的結構向量工作

vector<int> v; 

struct vector<int> v; 

代替,但它似乎編譯不在乎:http://codepad.org/TCPb8p2u

爲什麼這行得通?有或沒有struct有一些不同嗎?

+1

那麼這有什麼問題? – Tom 2011-04-21 21:22:25

+0

我認爲問題是:「如果這是有效的,它做我想表達的內容嗎?」 – Benoit 2011-04-21 21:25:20

回答

6

如果你寫class,它也可以。

class vector<int> v; 

看到這個:http://www.ideone.com/EoJxk

這實際上是舊的C風格。 C++標準在§3.4.4中將其稱爲闡述類型說明符

關鍵字struct(或classenum)有時用來除去歧義,或使隱藏名稱可見給編譯器。考慮標準本身的以下示例(來自§9.1/ 2)。請注意,存在一個struct名稱爲stat並用完全相同還存在功能

struct stat { 
    // ... 
}; 
stat gstat; // use plain stat to define variable 

int stat(struct stat*); // redeclare stat as function 

void f() 
{ 
    struct stat* ps; // struct prefix needed to name struct stat 
    // ... 
    stat(ps); //call stat() 
    // ... 
} 

第9.1節/ 2表示,

類定義引入了 類名進入 定義的範圍和在封閉範圍(3.3)中隱藏任何類,對象, 函數或該 名稱的其他聲明。如果一個 類名稱在一個範圍 其中一個對象,功能,或 枚舉同名也宣佈 ,宣告然後當兩個聲明 在範圍上,類可以 稱爲僅使用 詳細說明類型說明符(3.4.4)

2

這是C++的一個功能,用於解決變量和具有相同名稱的類型之間的歧義。我相信他們被稱爲'精心製作的類型說明符'。

當通常會有歧義時,您可以使用關鍵字來準確告訴編譯器您的意思。

藉此例如:

int x = 0; 
class x { }; 

// Compiler error! Am I refering to the variable or class x? 
x y; 

// This is okay, I'm telling the compiler which x I'm referring to. 
class x y; 

這也可以用來指定枚舉和工會,不僅僅是結構和類,雖然你只能使用相同的名稱一個用戶定義類型。

+0

謝謝,這對我來說是新的:在C++中,您可以用相同的名稱聲明變量和類! – 2011-04-21 21:32:33

+2

你也不應該這樣做。永遠。 :) – 2011-04-21 21:38:52

2

其他人已經解釋說你使用的是詳細說明了類型說明符,它可以用於名稱解除隱藏和模糊解析。

然而,什麼也工作在這裏的C++語言中的一個奇怪的特點,其中指出類的關鍵字(即classstruct關鍵字)在類的聲明中使用,不需要與所使用的類鍵同意在詳細的類型說明符中。例如。你可以用class關鍵字聲明你的課程,然後用struct關鍵字來指代它(反之亦然)。有一個在它

class S {}; 

int main() { 
    struct S s; // OK, 's' has type `S` (i.e. `class S`) 
} 

標準std::vector模板類沒有錯誤都被定義關鍵字class,但有在將其稱爲struct std::vector,這是你在你的例子做了什麼,沒有錯誤。

沒有,這都沒有區別你是否在你的v聲明中使用classstruct還是什麼都沒有。