Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在详细的说明符中使用typedef name_C++_G++_Typedef - Fatal编程技术网

C++ 在详细的说明符中使用typedef name

C++ 在详细的说明符中使用typedef name,c++,g++,typedef,C++,G++,Typedef,根据($3.4.4),typedef名称后跟类键是无效的。但我不确定是哪个范围?例如:在下面的例子中,编译器不会抱怨在诸如函数内部的块中使用了详细的说明符 typedef class { /* ... */ } S; // invalid class S; // ok void foo() { class S; } 使用typedef name在本地范围内声明类是否有效,为什么?问题是您声明的类没有名称,但使用别名(typedef)。后来,您使用了相同的名称来声明,但没有定义另一个类

根据($3.4.4),typedef名称后跟类键是无效的。但我不确定是哪个范围?例如:在下面的例子中,编译器不会抱怨在诸如函数内部的块中使用了详细的说明符

typedef class { /* ... */ } S;

// invalid
class S;

// ok
void foo() {
   class S;
}

使用typedef name在本地范围内声明类是否有效,为什么?

问题是您声明的类没有名称,但使用别名(typedef)。后来,您使用了相同的名称来声明,但没有定义另一个类(我知道这不是目的,但编译器理解这一点),并且它的名称与typedef冲突。当您在foo()中执行相同的操作时,这是一个单独的范围,因此是可以接受的。但请注意,foo()内部的“类S”与第一行中声明的类型不同。

在函数外部,不能在同一命名空间中声明与
typedef
同名的类


在函数内部,您正在声明一个新类,其作用域位于函数内部。它与周围命名空间中声明的匿名类不同。在函数中,这隐藏了
typedef

7.1.3第3段的声明:

在给定范围内,不得使用typedef说明符重新定义 在thascope中声明的任何类型的名称,以引用不同的 类型。 [示例:

错误:重新定义

然后是:

-类似地,在给定范围内,类或枚举 不应使用与所使用的typedef名称相同的名称声明 在该范围中声明,并引用除类或 列举本身。[示例:

//错误:重新定义

这是你的例子

class complex { /* ... */ }; 
typedef int complex; //
typedef int complex;
class complex { /* ... */ };