0

重複の可能性:
「template」および「typename」キーワードをどこに、なぜ配置する必要があるのですか?

最近、コードの一部が私を混乱させました:

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です。ただし、func2()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 に答える