结构矢量工作

时间:2011-04-21 21:19:22

标签: c++ struct

我在程序中犯了错误,我写了

struct vector<int> v;

而不是

vector<int> v;

但似乎编译器并不关心:http://codepad.org/TCPb8p2u

为什么会这样?是否有struct的差异?

3 个答案:

答案 0 :(得分:6)

如果你写class,它也会有效。

class vector<int> v;

请参阅:http://www.ideone.com/EoJxk

这实际上是旧C风格。 C ++标准在第3.4.4节中将其称为 elaborated-type-specifier

关键字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)。如果一个   类名在范围内声明   对象,功能或者   同名的调查员也是   声明,然后两个声明   在范围内,班级可以   仅提到使用   elaborated-type-specifier(3.4.4)

答案 1 :(得分: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;

这也可用于指定枚举和联合,而不仅仅是结构和类,尽管您只能有一个具有相同名称的用户定义类型。

答案 2 :(得分:2)

其他人已经解释过你使用的是详细类型说明符,它可以用于名称取消隐藏和模糊解析。

然而,这里也有用的是C ++语言的一个奇怪的特性,它声明在类声明中使用的 class-key (即classstruct关键字)是不需要同意详细说明的类型说明符中使用的 class-key 。例如。您可以使用class关键字声明自己的课程,然后使用struct关键字引用它(反之亦然)。它没有错误

class S {};

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

标准std::vector模板类是使用关键字class声明的,但在将其称为struct std::vector时没有错误,这就是您在示例中所做的。

不,在您使用vclass的声明中,或者在使用struct或根本没有声明时,这一点没有区别。