如果我尝试从继承层次结构另一端的模板类调用基类成员的成员函数,
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
中间类派生的;所以我不想改变任何关于它的东西),也不是直接派生自{{1的模板类}}
这里有什么问题?
答案 0 :(得分:3)
你做得不对:
using basis::foo; //wrong way
什么是basis
?它不是choice
的基类。你应该这样做:
typedef crtp< basis, choice<Option> > base;
using base::basis::foo;
由于crtp< basis, choice<Option> >
是choice
类的基础,foo
成为choice
的成员,通过其基类。所以有一个微妙的区别。