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

SSi*_*ht3 -2 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
};
Run Code Online (Sandbox Code Playgroud)

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

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)
   }
};
Run Code Online (Sandbox Code Playgroud)

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

澄清:

模板继承问题不是问题,它是上下文(因此我没有得到像'某某某类继承'这样的评论),问题是 using关键字只能应用于单个函数,很乏味 - 我想将它应用到整个TestA类,而不是使用关键字编写20+(这比使用50+这个 - > esque调用仍然更有效,无论如何都可能需要修改).

Pra*_*ian 5

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

TestB例如,当正在使用的某个人创建该类的实例时,TestB<int>不再存在名称查找问题,因为TestA已经解析了依赖类型,并且您可以自由地调用其任何公共成员.

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

  • 不要试图自鸣得意,但如果写'this-> foo()`太繁琐,那就太难了!这就像说当你定义一个成员函数的主体写'void Foo :: Bar(){...}`时输入太多而你宁愿写`void Foo:Bar(){...}` .这是语言定义的规则,你必须忍受它.在这种情况下,正如FAQ所述,你的编译器可能不会抱怨,特别是如果它是MSVC,因为(最后我听到)它实际上并没有进行两个阶段名称查找. (3认同)