Наследование шаблонного производного класса через класс CRTP, доступ к объекту-члену базового класса - PullRequest
3 голосов
/ 24 января 2012

Если я пытаюсь вызвать функцию-член члена базового класса из шаблонного класса на другом конце иерархии наследования,

class memberobj {public: void bar(){}};

class basis {public: memberobj foo;};

template<class Base, class Derived>
class crtp : public Base { /* ... */ };

template<class Option>
class choice : crtp< basis, choice<Option> > {
  using basis::foo;
 public:
  void test () {foo.bar();}
};

class someoption {};

int main() {
  choice<someoption> baz;
  baz.test();
  return 0;
}

Я получаю это сообщение об ошибке:

g++-4.6 -o bin/crtptest crtptest.cpp
crtptest.cpp: In member function ‘void choice<Option>::test()’:
crtptest.cpp:12:21: error: ‘class basis’ has no member named ‘bar’
make: *** [bin/crtptest] Error 1

хотя bar, очевидно, является членом , членом basis, а не basis.
Этого не происходит с нешаблонными конечными классами (из которыхчисло уже используется, все производные от промежуточного класса crtp, поэтому я бы не хотел ничего менять в этом), а также с шаблоном класса, который напрямую получен из basis.

Чтоздесь не так?

1 Ответ

3 голосов
/ 24 января 2012

Вы делаете это неправильно:

 using basis::foo; //wrong way

Что такое basis? Это не базовый класс choice. Вы должны сделать это вместо этого:

typedef crtp< basis, choice<Option> > base;
using base::basis::foo;

Поскольку crtp< basis, choice<Option> > является базой класса choice, а foo становится членом от choice до его базового класса. Так что есть небольшая разница.

Теперь это работает: http://ideone.com/RPnyZ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...