C ++ Template类继承具有模板指定输入类型的另一个模板类

时间:2010-07-19 00:36:03

标签: c++ inheritance templates

  

可能重复:
  GCC problem : using a member of a base class that depends on a template argument
  Why does GCC need extra declarations in templates when VS does not?
  Why doesn’t a derived template class have access to a base template class
  iphone compiler inherited templated base classes with passed through type not being expanded in time (just look)

很抱歉这个令人困惑的标题,我能想出最好的。

这里有一些代码来说明我的问题...

基本模板类:

template<class T> class TestBase
{
public:
   int someInt;
};


尝试使用另一个模板类继承TestBase ...

这在编译时得到“someInt未在此范围内声明”:

template<class X> class TestSub : public TestBase<X>
{
   void testf()
   {
       someInt = 0; //Error: "someInt was not declared in this scope"
   }
};



B) 这很好(不同之处在于我明确指定了TestBase的模板输入)

template<class X> class TestSub : public TestBase<string>
{
   void testf()
   {
       someInt = 0;
   }
};



为什么(A)的TestSub不像(B)中那样正确地继承someInt?

提前致谢。

1 个答案:

答案 0 :(得分:7)

因为无论X最终存在什么,TestBase都可以专注于X.因此,您需要让编译知道someInt是完全限定它的依赖值。而不是

     someInt = 0

说而不是

     TestBase<X>::someInt = 0

您也可以使用

     this->someInt = 0

重点是编译器不会假定名称依赖于模板参数,它必须知道它在将该检查推迟到实例化时间之前。对于实验,请参阅引入全局someInt时会发生什么。