模板化派生类通过CRTP类继承,访问基类成员对象

时间:2012-01-23 20:03:47

标签: c++ templates inheritance member crtp

如果我尝试从继承层次结构另一端的模板类调用基类成员的成员函数,

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的模板类}}

这里有什么问题?

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 的成员,通过其基类。所以有一个微妙的区别。

现在可行:http://ideone.com/RPnyZ