Если я пытаюсь вызвать функцию-член члена базового класса из шаблонного класса на другом конце иерархии наследования,
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
.
Чтоздесь не так?