Подкласс C ++ с использованием ключевого слова вопрос - PullRequest
0 голосов
/ 09 сентября 2011

Скажите, что у меня есть следующее:

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+ вызовов this-> esque, которые в любом случае, возможно, придется изменить).

Ответы [ 2 ]

5 голосов
/ 09 сентября 2011

Вы неправильно поняли, что пытается объяснить FAQ.Проблема поиска имени возникает в TestB, когда вы пытаетесь вызвать функцию-член из ее базового класса TestA, потому что тип последнего зависит от параметра шаблона.Тем не менее, все открытые члены TestA наследуются TestB и видны его вызывающим.

Когда кто-то, использующий TestB, создает экземпляр класса, скажем TestB<int>,тогда больше нет проблем с поиском имени, так как зависимые типы TestA были разрешены, и вы можете вызывать любого из его открытых членов.

Если вы будете вызывать TestA<T>::FunctionX() из одногоиз функций TestB, вот тогда возникает проблема поиска имени.Как часто задаваемые вопросы предлагают, если вам нужно сделать это, просто вызовите функцию как this->FunctionX() в TestB.

1 голос
/ 09 сентября 2011

Если вы действительно хотите это сделать, почему бы не создать имя файла .in, а затем создать имя файла в вашем make-файле или что-то еще с помощью сценария оболочки или сценария perlили похожие?Это был мой подход к написанию утомительного кода более одного раза.

...