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

typedef'd type not visible as return type of a member function

提问人:A. K. 提问时间:8/6/2011 最后编辑:A. K. 更新时间:8/6/2011 访问量:2356

问:

此程序编译失败(使用 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'd,那有什么问题。typedef int myType_t;abc

C++ 作用域 typedef

评论

3赞 Johannes Schaub - litb 8/6/2011
下次发布一些代码时,最好先删除行号。你所拥有的代码不是一个合适的测试用例。
0赞 A. K. 8/6/2011
Alrite,问题出在编辑器中,行号也会被复制。下次我会处理的。vi
0赞 Bill 8/6/2011
@Aditya:正确的测试用例:我可以复制到编译器中并在不进行任何更改的情况下进行编译的代码。看看我复制这个时会发生什么?ideone.com/I60DW
1赞 Kevin M 8/6/2011
这是不是有点迂腐?
0赞 Vitus 8/6/2011
不管是不是迂腐,这其实是个好主意。

答:

6赞 Nawaz 8/6/2011 #1
myType_t abc::fun1()

由于是嵌套类型,所以你必须这样写:myType_t

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

abc::告诉在类中定义的编译器。你写的和你写的方式是一样的。但是在类内,你不需要写,无论是 for ,还是 for 。myType_tabcabc::myType_tabc::fun1()abc::myType_tfun1()

11赞 Alok Save 8/6/2011 #2

从 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()
7赞 Matthieu M. 8/6/2011 #3

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

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

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

这可以使用 C++0x 延迟返回类型语法来克服

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

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