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 回答