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>();