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

Jos*_*sen 8 c++ inheritance templates

可能的重复:
GCC问题:使用依赖于模板参数的基类成员
为什么当VS没有时,GCC在模板中需要额外的声明?
为什么派生模板类不能访问基本模板类
iphone编译器继承模板化基类,传递类型未及时扩展(只看)

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

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

基本模板类:

template<class T> class TestBase
{
public:
   int someInt;
};
Run Code Online (Sandbox Code Playgroud)


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

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

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



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

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



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

提前致谢.

Log*_*ldo 7

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

     someInt = 0
Run Code Online (Sandbox Code Playgroud)

说的

     TestBase<X>::someInt = 0
Run Code Online (Sandbox Code Playgroud)

你也可以用

     this->someInt = 0
Run Code Online (Sandbox Code Playgroud)

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

  • 或者不用完全限定,只需使用`this-&gt;someInt`。 (2认同)

归档时间:

查看次数:

12361 次

最近记录:

15 年,5 月 前