C++ C++;模板继承看不到基类成员

C++ C++;模板继承看不到基类成员,c++,inheritance,C++,Inheritance,请查看以下代码: template<class MT> class ClassA { public: int cnt; }; template<class MT> class ClassB : public ClassA<MT> { public: void test() { cnt++ ; } }; 模板 甲级{ 公众: int-cnt; }; 样板 B类:公共A类{ 公众: 无效测试(){ cnt++; } }; 编译时,

请查看以下代码:

template<class MT>
class ClassA {
public:
  int cnt;
};

template<class MT>
class ClassB : public ClassA<MT> {
public:

   void test() {
     cnt++ ;
   }
};
模板
甲级{
公众:
int-cnt;
};
样板
B类:公共A类{
公众:
无效测试(){
cnt++;
}
};
编译时,g++会给出一个错误,即“cnt”未在作用域中声明


如果我将cnt更改为this->cnt,它会工作。然而,我感到困惑。有人能解释一下为什么它不起作用吗?

原因是
cnt
不是一个依赖名称(不依赖于模板参数),因此语言状态的规则是,您必须使用
this->
base::
来限定它

编译模板不会自动在基类中查找名称。以下是我能在短时间内找到的唯一解释:

一个简单的解决方法是添加

using ClassA<MT>::cnt;
使用ClassA::cnt;

我想我应该扩展马克B的答案(尽管他完全正确)

语言的规则规定您必须使用此->或基来限定它

该语言的规则是存在的,因为在许多情况下,编译器在编译时根本不知道在哪里查找该名称:cnt可能存在于父类中,也可能不存在

以以下为例:

template<class MT>
class ClassA {
public:
};

template<class MT>
class ClassB : public ClassA<MT> {
public:

   void test() {
     cnt++ ;
   }
};

template<>
class ClassA<int>
{
public:
  int cnt;
};

(因此,常规模板中的cnt与专业化中的cnt不匹配)。

感谢您的详细解释。非常感谢。
template<class MT>
class ClassA {
public:
};

int cnt = 50;
template<class MT>
class ClassB : public ClassA<MT> {
public:

   void test() {
     cnt++ ;
   }
};

template<>
class ClassA<int>
{
public:
  int cnt;
  ClassA(){cnt=0;}
};

template <>
class ClassB<int> : public ClassA<int>
{
public:
  void test() {
    cnt++ ;
  }
};

int main () {

ClassB<int> bi;
ClassB<float> bf;
bi.test();
bf.test();

std::cout << cnt << std::endl;
std::cout << bi.cnt << std::endl;
}
51
1