我在我的程序做了一個錯誤,我寫的結構向量工作
vector<int> v;
struct vector<int> v;
代替,但它似乎編譯不在乎:http://codepad.org/TCPb8p2u
爲什麼這行得通?有或沒有struct
有一些不同嗎?
我在我的程序做了一個錯誤,我寫的結構向量工作
vector<int> v;
struct vector<int> v;
代替,但它似乎編譯不在乎:http://codepad.org/TCPb8p2u
爲什麼這行得通?有或沒有struct
有一些不同嗎?
如果你寫class
,它也可以。
class vector<int> v;
看到這個:http://www.ideone.com/EoJxk
這實際上是舊的C風格。 C++標準在§3.4.4中將其稱爲闡述類型說明符。
關鍵字struct
(或class
,enum
)有時用來除去歧義,或使隱藏名稱可見給編譯器。考慮標準本身的以下示例(來自§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)。
這是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;
這也可以用來指定枚舉和工會,不僅僅是結構和類,雖然你只能使用相同的名稱一個用戶定義類型。
謝謝,這對我來說是新的:在C++中,您可以用相同的名稱聲明變量和類! – 2011-04-21 21:32:33
你也不應該這樣做。永遠。 :) – 2011-04-21 21:38:52
其他人已經解釋說你使用的是詳細說明了類型說明符,它可以用於名稱解除隱藏和模糊解析。
然而,什麼也工作在這裏的C++語言中的一個奇怪的特點,其中指出類的關鍵字(即class
或struct
關鍵字)在類的聲明中使用,不需要與所使用的類鍵同意在詳細的類型說明符中。例如。你可以用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
聲明中使用class
,struct
還是什麼都沒有。
那麼這有什麼問題? – Tom 2011-04-21 21:22:25
我認爲問題是:「如果這是有效的,它做我想表達的內容嗎?」 – Benoit 2011-04-21 21:25:20