必须在类成员函数返回类型中提供更具体的类型,但不是参数类型?
可能重复:
Where and why do I have to put the “template” and “typename” keywords?必须在类成员函数返回类型中提供更具体的类型,但不是参数类型?
最近的一段代码让我感到困惑:
class A {
public:
typedef int SomeType;
void func(SomeType i);
SomeType func2();
};
void A::func(SomeType i) {
cout << "in A, value: " << i << endl;
}
SomeType A::func2() {
return 123;
}
int main() {
A a;
}
G ++ 4.4提供了一个编译错误,它并不知道SOMETYPE在编译A :: func2:
error: 'SomeType' does not name a type
但同样SOMETYPE在A :: FUNC编译好(SOMETYPE我):
class A {
public:
typedef int SomeType;
void func(SomeType i);
};
void A::func(SomeType i) {
cout << "in A, value: " << i << endl;
}
任何人都可以帮助我理解?看来C++对待参数类型和返回类型是不公平的?
GCC是正确的 -
/* can't use unqualified name */ A:: /* can use unqualified name */ () {
}
在A::
之前,您需要使用A::
来限定嵌套类型。因此,你需要:
A::SomeType A::func2() {
//whatever
}
是的,我可以理解这可能是必要的,但是让我困惑的是为什么参数类型不需要A :: – Kai 2012-07-25 22:40:57
@凯这就是语言的工作原理。在使用'A :: func2'限定定义之后,您已经在该类的名称范围内。没有那么多。你不应该在这上面浪费太多时间。这就是语言的设计,纯粹和简单。 – 2012-07-25 22:47:19
您需要更改
SomeType A::func2() {
到
A::SomeType A::func2() {
,这不同于FUNC1(原因)是SomeType
在参数表中使用有这样编译器知道它可以请在class A
中查看该类型。但是,func2()
,SomeType
是返回类型,编译器不知道在class A
中查找。
简单地改变FUNC2来定义:
A::SomeType A::func2() {
return 123;
}
你需要告诉编译器要使用A类中定义的类型名SOMETYPE
相反,使用这个资格与类名SOMETYPE在
A::SomeType A::func2() {
(...)
}
SOMETYPE不能外A类和FUNC2是A类 此URL外部可见的使用 - 指出在C++规范
http://balbir.blogspot.com/2005/06/scope-of-typedefs-in-class-in-c.html
在特别是下列,类型名称类defini内限定如果没有资格,他们不能在课外使用 。
@Xeo:只有依赖模板参数的名称才需要'typename' /'template'关键字。这里没有模板。 – interjay 2012-07-25 19:04:05
在类声明之外使用'A :: SomeType'而不是'SomeType'修复了它。 HTTP:// ideone。com/1VZdy – Wug 2012-07-25 19:08:15
@interjay:对,nvm。最近用模板处理很多事情,只是没有发生,这不是*一个。 :s – Xeo 2012-07-25 19:08:26