根据($ 3.4.4)类型密钥后跟一个类型密钥无效。但我不确定哪个范围?例如:在下面,如果在一个块中使用了详细的说明符,编译器不会抱怨,例如在函数内部。
typedef class { /* ... */ } S;
// invalid
class S;
// ok
void foo() {
class S;
}
使用typedef-name声明一个类在本地范围内是否有效,为什么?
答案 0 :(得分:5)
7.1.3第3段告诉:
在给定范围内,不得使用typedef说明符重新定义 在thascope中声明的任何类型的名称,以指代不同的名称 类型。 [例如:
class complex { /* ... */ };
typedef int complex; //
错误:重新定义
然后呢:
-end example]同样,在给定的范围内,类或枚举 不得声明与typedef-name相同的名称 在该范围内声明并且指的是类或者以外的类型 枚举本身。 [实施例:
typedef int complex;
class complex { /* ... */ };
//错误:重新定义
这是你的榜样。
答案 1 :(得分:2)
问题是您声明了没有名称的类,但使用了别名(typedef)。后来,你使用相同的名称声明而没有定义另一个类(我知道这不是意图,但这是编译器理解的)和它的名字与typedef冲突。当你在foo()中做同样的事情时,那是一个独立的范围,所以是可以接受的。但请注意,foo()中的'class S'与第一行中声明的类型不同。
答案 2 :(得分:0)
在函数外部,您不能在同一名称空间中声明与typedef
同名的类。
在函数内部,您将声明一个新类,作用于函数内部。它与周围命名空间中声明的匿名类不同。在函数中,这隐藏了typedef
的声明。