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

C++ typedef';d类型作为成员函数的返回类型不可见,c++,scope,typedef,C++,Scope,Typedef,该程序无法编译(使用gcc-4.5)。错误消息显示: 错误:“myType\u 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

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

错误:“myType\u 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'd,那么问题是什么

myType_t abc::fun1()
由于
myType\u t
是嵌套类型,因此您必须编写以下代码:

  abc::myType_t  abc::fun1()
//^^^^^^^^^^^^^note this!
abc::
告诉编译器
myType\u t
是在类
abc
中定义的。您编写
abc::myType\t
的方式与编写
abc::fun1()
的方式相同。但在类中,你不需要编写<代码> ABC::/COD>,既不用于<代码> MyType Ty> <代码>,也不适用于<代码> FUN1](< /代码> .< /P> < P>:从C++标准:

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

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

因此,您需要通过以下方式访问它:

abc::myType_t abc::fun1()

这是因为C++语法中的怪癖。< /P> 由于成员函数的类仅在声明函数本身的名称时才被精确化,因此在此之前的任何内容都必须完全阐明

ReturnType
ClassName
::             // only here do we enter the scope 'ClassName'
FunctionName
(
  ArgumentType0,
  ArgumentType1,
  ...
) {
}
这可以通过使用C++0x延迟返回类型语法来克服

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

因为它将返回类型的声明延迟到足够长的时间才能进入范围(它还允许基于函数的参数来声明它,例如使用
decltype

下次发布一些代码时,最好先删除行号。您拥有的代码不是一个合适的testcase.alrite,问题是
vi
编辑器中的行号也会被复制。我将从下次开始处理这个问题。@Aditya:正确的测试用例:我可以复制到我的编译器中编译而不做任何更改的代码。看到我复制这个时会发生什么吗?这不是有点迂腐吗?迂腐与否,这其实是个好主意。
auto
ClassName
::
FunctionName
(
  ArgumentType0,
  ArgumentType1,
  ...
)
->
ReturnType
{
}