使用关键字问题的C ++子类

时间:2011-09-08 21:14:20

标签: c++ subclass

说我有以下内容:

template<typename TemplateItem>
class TestA
{
    public:
        TemplateItem Item;

        void Function1(){;}
        void Function2(){;}
        void Function3(){;}
        void Function4(){;}
        //Etc etc number of functions is quite lengthy
};

template<typename TemplateItem>
class TestB : public TestA<TemplateItem>
{
    public:
        //How would I use the 'using' keyword to include everything from TestA
        //Without manually declaring it for 20 or more functions/variables individually
};

对于那些不熟悉模板类继承问题的人:

http://www.parashift.com/c++-faq-lite/templates.html#faq-35.19

有些人似乎仍然认为没有这样的遗传问题,尽管上面的链接说明相反,但引用上面给出的网站:

template<typename T>
 class B {
 public:
   void f() { }  ← member of class B<T>
 };

 template<typename T>
 class D : public B<T> {
 public:
   void g()
   {
     f();  ← bad (even though some compilers erroneously (temporarily?) accept it)
   }
};
  

但是有关如何查找名称的问题。

澄清:

模板继承问题是问题,它是上下文(所以我不会像'某某类继承'这样的评论),问题 using关键字只能应用于单个函数,这很乏味 - 我想将它应用于整个TestA类,而不是使用关键字写20+(仍然是比附加50+这个&gt; esque调用更有效率,无论如何都可能需要修改。

2 个答案:

答案 0 :(得分:5)

你误解了FAQ试图解释的内容。当您尝试从其基类TestB调用成员函数时,名称查找问题发生在TestA内,因为后者的类型取决于模板参数。但是,所有TestA的公共成员都由TestB继承,并且对其调用者可见。

当使用TestB的人创建该类的实例时,比如说TestB<int>,那么由于TestA的依赖类型已经解决,因此名称查找不再存在问题。你可以自由地给任何公共成员打电话。

如果你要从TestA<T>::FunctionX()的一个函数中调用TestB,那就是出现名称查找问题的时候。正如常见问题解答建议的那样,如果您需要这样做,只需在this->FunctionX()内将该函数调用为TestB

答案 1 :(得分:1)

如果你真的想要这样做,为什么不在你的makefile中创建一个文件名 .in然后创建 filename ,或者你有一个shell脚本或者perl脚本或类似?这是我不止一次编写繁琐代码的方法。