说我有以下内容:
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调用更有效率,无论如何都可能需要修改。
答案 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脚本或类似?这是我不止一次编写繁琐代码的方法。