0

可能重复:
我必须在哪里以及为什么要放置“模板”和“类型名称”关键字?

最近一段代码让我很困惑:

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

4 回答 4

1

gcc 是对的-

/* can't use unqualified name */  A:: /* can use unqualified name */  () {
}

在 之前A::,您需要使用 来限定嵌套类型A::。所以你需要:

A::SomeType A::func2() {  
   //whatever
}
于 2012-07-25T19:08:19.663 回答
0

你需要改变

SomeType A::func2() {

A::SomeType A::func2() {

这与 func1() 不同的原因是它SomeType在参数列表中使用,以便编译器知道它可以查找class A类型。但是, withfunc2()SomeType返回类型,编译器还不知道要查看class A

于 2012-07-25T19:06:53.383 回答
0

只需将 func2 的定义更改为:

A::SomeType A::func2() {
    return 123;
}

您需要告诉编译器您要使用在类 A 中定义的 SomeType 类型名。

于 2012-07-25T19:06:54.290 回答
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

特别是,在类定义中定义的类型名称不能在没有限定的情况下在其类之外使用。

于 2012-07-25T19:15:57.053 回答