5

基底クラスでテンプレート化されていないメンバー関数を呼び出す場合、その名前をusing派生クラスにインポートして使用できます。これは、基本クラスのテンプレート メンバー関数でも可能ですか?

それだけでusingは機能しません (g++-snapshot-20110219 -std=c++0x を使用):

template <typename T>
struct A {
  template <typename T2> void f() {  }
};

template <typename T>
struct B : A<T> {
  using A<T>::f;

  template <typename T2> void g() {
    // g++ throws an error for the following line: expected primary expression before `>`
    f<T2>();
  }
};

int main() {
  B<float> b;
  b.g<int>();
}

次のように、基本クラスに明示的に接頭辞を付けることを知っています

    A<T>::template f<T2>();

正常に動作しますが、問題は次のとおりです。単純な using 宣言を使用する場合と使用しない場合 (fテンプレート関数ではない場合と同様) は可能ですか?

これが不可能な場合、誰かがその理由を知っていますか?

4

2 に答える 2

10

これは機能します(しゃれが意図されています):this->template f<T2>();

そうです

template <typename T>
struct B : A<T> {
  template <typename T2> void f()
  { return A<T>::template f<T2>(); }

  template <typename T2> void g() {
    f<T2>();
  }
};

usingテンプレート依存のテンプレート関数で機能しない理由は非常に単純です。文法では、そのコンテキストで必要なキーワードが許可されていません。

于 2011-03-09T04:57:07.913 に答える
1

私はあなたが使うべきだと信じています:

this->A<T>::template f<T2>();

また:

this->B::template f<T2>();

于 2011-03-09T05:02:44.350 に答える