typedef'd type不可见作为成员函数的返回类型

时间:2011-08-05 18:12:44

标签: c++ scope typedef

此程序无法编译(使用gcc-4.5)。错误消息显示:

错误:'myType_t'未命名类型

  1 class abc{
  2 //typedef int myType_t;
  3 
  4   public:
  5 typedef int myType_t;
  6 
  7     abc();
  8     myType_t fun1();
  9 };
 10 
 11 myType_t abc::fun1()
 12 {
 13   return 0;
 14 }
 15 
 16 int main()
 17 {
 18   abc abc1;
 19   return 0;
 20 }

现在在类typedef int myType_t;之外声明abc进行此编译。 我的困惑是,如果成员函数的返回类型在类中是typedef,那么问题是什么。

3 个答案:

答案 0 :(得分:9)

来自C ++标准:

9.9嵌套类型名称 [class.nested.type]

类型名称遵循与其他名称完全相同的范围规则。特别是,类定义中定义的类型名称不能在其类别之外使用而无需限定。

class X {
public :
   typedef int I;
   class Y { /  . . .  / };
   I a;
};

I b;            // error
Y c;            // error
X::Y d;         // OK
X::I e;         // OK

所以你需要以下列方式访问它:

abc::myType_t abc::fun1()

答案 1 :(得分:5)

myType_t abc::fun1()

由于myType_t是嵌套类型,所以你要编写这个:

  abc::myType_t  abc::fun1()
//^^^^^^^^^^^^^note this!

abc::告诉编译器myType_t在类abc中定义。您编写abc::myType_t的方式与编写abc::fun1()的方式相同。但在课堂上,您无需为abc::myType_t撰写fun1()

答案 2 :(得分:3)

这是因为C ++语法的怪癖。

因为成员函数的类仅在声明函数本身名称的时刻被精确化,所以之前的任何内容都必须完全拼写出来。

ReturnType
ClassName
::             // only here do we enter the scope 'ClassName'
FunctionName
(
  ArgumentType0,
  ArgumentType1,
  ...
) {
}

这可以使用C ++ 0x late return type syntax

来克服
auto
ClassName
::
FunctionName
(
  ArgumentType0,
  ArgumentType1,
  ...
)
->
ReturnType
{
}

因为它将返回类型的声明推迟到足以进入范围(它还允许根据函数的参数声明它,例如使用decltype。)