在详细说明符中使用typedef名称

时间:2011-11-30 12:40:02

标签: c++ g++ typedef

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

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

// invalid
class S;

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

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

3 个答案:

答案 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的声明。