2011-04-21 85 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还是什么都没有。