必须在类成员函数返回类型中提供更具体的类型,而不是参数类型?

时间:2012-07-25 18:59:40

标签: c++

  

可能重复:
  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 ++对参数类型和返回类型不公平吗?

4 个答案:

答案 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

特别是,不能使用类定义中定义的类型名称 没有资格的课外。