此程序无法编译(使用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,那么问题是什么。
答案 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
。)