Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板类看不到继承的模板成员 让我考虑一个从基础模板类派生的模板类。基类包含一个模板成员。在这种情况下,通常可以使用该指针从派生类访问基类的成员。然而,当基成员本身是模板函数时,情况似乎并非如此_C++_Templates - Fatal编程技术网

C++ 模板类看不到继承的模板成员 让我考虑一个从基础模板类派生的模板类。基类包含一个模板成员。在这种情况下,通常可以使用该指针从派生类访问基类的成员。然而,当基成员本身是模板函数时,情况似乎并非如此

C++ 模板类看不到继承的模板成员 让我考虑一个从基础模板类派生的模板类。基类包含一个模板成员。在这种情况下,通常可以使用该指针从派生类访问基类的成员。然而,当基成员本身是模板函数时,情况似乎并非如此,c++,templates,C++,Templates,考虑以下代码 #include <iostream> template <class T> struct base { T x; base() { x = 10; } template <unsigned int N> void increment() { x += N; } }; template <class T> struct deriv : public base<T> { using base<T

考虑以下代码

#include <iostream>

template <class T>
struct base {
  T x;
  base() { x = 10; }
  template <unsigned int N>
  void increment() { x += N; }
};

template <class T>
struct deriv : public base<T> {
  using base<T>::base;

  void p()
  {
    using namespace std;
    cout << this->x << endl;
    base<int>::increment<1>();
    // The following statement causes the compile error:
    // expected primary-expression before ‘)’ token
    // this->increment<1>();
    // Also the following statement gives error
    // base<T>::increment<1>();
    cout << this->x << endl;
  }
};

int main()
{
  using namespace std;

  base<int> A;
  cout << A.x << endl;
  A.increment<1>();
  cout << A.x << endl;

  deriv<int> B;
  B.p();

  return 0;
}
给出编译错误

expected primary-expression before ‘)’ token
在尝试了一段时间后,我发现可以通过scope操作符访问increment函数,如上面的代码所示

base<int>::increment<1>();
我得到了与上面相同的错误

我使用的是gcc 8.1.1

问题是:为什么编译器不能使用指针解析继承的成员函数增量?如何从继承的类库实例化继承的模板函数increment

编辑:我添加了另一个无法编译的情况,最好指定问题

编辑:程序中的小更正,同样的问题。

调用此->增量无效,因为增量是一个依赖函数模板。因此,您需要使用模板关键字:


除非您另外指定,否则编译器将假定您访问的名称不是模板,因此这两个名称都将分别标记为小于号和大于号。行将解析为此->增量。这是因为This和base都依赖于模板参数T,并且编译器无法查找increment以查看它是否是模板。这适用于运算符左侧的名称依赖于任何模板参数,右侧的名称是带名称的模板id的任何情况。要解决此问题,需要使用template关键字

基::模板增量; 此->模板增量; 为什么基数::增量;那么编译?因为它不依赖于引用已知专门化的T,因此可以查找名称增量来确定它是否是模板。 但是如果t不是int,它就不会编译 [x86-64 gcc 8.1 1]错误:类型“base”不是类型“deriv”的基类型
如果base::increment是public static,那么代码总是不会完全编译,因为编译器会编译x不是静态的,但是如果进行其他更改,它会编译。

谢谢!在我发布问题后,我注意到并纠正了错误的使用声明,但是你更快了!感谢您提供的解决方案,我不知道这种语法。
base<int>::increment<1>();
base<T>::increment<1>();
this->template increment<1>();
base<T>::template increment<1>();