#include<iostream>
template<int n>
class Parent
{
public:
static const unsigned int n_parent = 5 + n;
};
template<int n>
class Son : public Parent<n>
{
public:
static void foo();
static const unsigned int n_son = 8 + n;
};
template<int n>
void Son<n>::foo()
{
std::cout << "n_parent = " << n_parent << std::endl;
std::cout << "n_son = " << n_son << std::endl;
}
这段代码会产生错误
错误:使用未声明的标识符'n_parent'
我必须明确指定模板参数:
template<int n>
void Son<dim>::foo()
{
std::cout << "n_parent = " << Son<n>::n_parent << std::endl;
std::cout << "n_son = " << n_son << std::endl;
}
为什么子模板类不能隐式推断出继承成员的适当范围?
答案 0 :(得分:1)
编译器不解析模板基类的继承成员,因为您可能具有未定义成员的特化,并且在这种情况下整个解析/名称解析业务将变得非常困难。
如果您的会员是非静态会员,那么使用this->n_parent
&#34;确保&#34; n_parent
确实是基类成员的编译器。如果成员是static
,则没有this
指针(如您所述),因此唯一的选择是像您一样限定基类。