我在我的程序做了一个错误,我写的结构向量工作
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