5

ビジュアル C++ では、次のようなことができます。

template <class T>
class A{
protected:
    T i;
};

template <class T>
class B : public A<T>{
    T geti() {return i;}
};

これを g++ でコンパイルしようとすると、エラーが発生します。私はこれをしなければなりません:

template <class T>
class B : public A<T>{
    T geti() {return A<T>::i;}
};

標準 C++ で前者を実行することは想定されていませんか? または、gcc で何かが誤って構成されており、エラーが発生していますか?

4

3 に答える 3

6

これは以前は許可されていましたが、gcc 3.4で変更されました。

テンプレート定義では、修飾されていない名前は依存ベースのメンバーを検出しなくなりました (C++ 標準の [temp.dep]/3 で指定されているように)。例えば、

    template <typename T> struct B {
      int m;
      int n;
      int f ();
      int g ();
    };
    int n;
    int g ();
    template <typename T> struct C : B<T> {
      void h ()
      {
        m = 0; // error
        f ();  // error
        n = 0; // ::n is modified
        g ();  // ::g is called
      }
    };

たとえば、名前の前に this-> を付けて、名前を依存させる必要があります。C::h の修正された定義は次のとおりです。

    template <typename T> void C<T>::h ()
    {
      this->m = 0;
      this->f ();
      this->n = 0
      this->g ();
    }
于 2008-10-11T21:02:17.547 に答える
3

私はこれを理解しました:

どうやら、最初の例は有効な C++ ではなく、msvc がこれを取るのは悪いことです。C++ faq lite に投稿された解決策があります。

于 2008-10-11T21:03:34.813 に答える
0

2 フェーズの名前検索について読みたいと思うかもしれません

于 2008-10-12T15:09:53.263 に答える