可能重复:
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给出了一个编译错误,它在编译A :: func2时不知道SomeType:
error: 'SomeType' does not name a type
但同样的SomeType在 A :: func(SomeType i)中编译良好:
class A {
public:
typedef int SomeType;
void func(SomeType i);
};
void A::func(SomeType i) {
cout << "in A, value: " << i << endl;
}
任何人都可以帮我理解这个吗?看来C ++对参数类型和返回类型不公平吗?
答案 0 :(得分:1)
gcc是对的 -
/* can't use unqualified name */ A:: /* can use unqualified name */ () {
}
在A::
之前,您需要使用A::
限定嵌套类型。所以你需要:
A::SomeType A::func2() {
//whatever
}
答案 1 :(得分:0)
您需要更改
SomeType A::func2() {
到
A::SomeType A::func2() {
这与func1()的不同之处在于SomeType
在参数列表中使用,以便编译器知道它可以在class A
中查找该类型。但是,对于func2()
,SomeType
是返回类型,编译器还不知道要查看class A
。
答案 2 :(得分:0)
只需将func2的定义更改为:
A::SomeType A::func2() {
return 123;
}
您需要告诉编译器您要使用在A类中定义的SomeType类型名称。
答案 3 :(得分:0)
相反,请将此Qualify 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
特别是,不能使用类定义中定义的类型名称 没有资格的课外。