Как вызвать функцию-член шаблона в базовом классе шаблона? - PullRequest
5 голосов
/ 09 марта 2011

При вызове функции-члена без шаблонов в базовом классе можно импортировать ее имя с 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>();

работает нормально, но вопрос в следующем: возможно ли это без и с помощью простого объявления использования (как это происходит в случае, когда f не является функцией шаблона)?

Если это невозможно, кто-нибудь знает почему?

Ответы [ 2 ]

10 голосов
/ 09 марта 2011

это работает (каламбур): 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 не работает с шаблонно-зависимыми шаблонными функциями, довольно просто - грамматика не учитывает необходимые ключевые слова в этом контексте.

1 голос
/ 09 марта 2011

Я считаю, что вы должны использовать:

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

или

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

...