派生模板-对基类成员的类访问-数据这个问题是本文所提问题的进一步。这条线.使用以下类定义:template <class T>class Foo {public:
Foo (const foo_arg_t foo_arg) : _foo_arg(foo_arg)
{
/* do something for foo */
}
T Foo_T; // either a TypeA or a TypeB - TBD
foo_arg_t _foo_arg;};template <class T>class Bar : public Foo<T> {public:
Bar (const foo_arg_t bar_arg, const a_arg_t a_arg)
: Foo<T>(bar_arg) // base-class initializer
{
Foo<T>::Foo_T = T(a_arg);
}
Bar (const foo_arg_t bar_arg, const b_arg_t b_arg)
: Foo<T>(bar_arg)
{
Foo<T>::Foo_T = T(b_arg);
}
void BarFunc ();};template <class T>void Bar<T>::BarFunc () {
std::cout << _foo_arg << std::endl; // This doesn't work - compiler error is: error: ‘_foo_arg’ was not declared in this scope
std::cout << Bar<T>::_foo_arg << std::endl; // This works!}在访问模板类的基类成员时,似乎必须始终使用模板样式语法对成员进行显式限定。Bar<T>::_foo_arg..有办法避免这种情况吗?“使用”语句/指令能否在模板类方法中发挥作用以简化代码?编辑:通过使用以下->语法对变量进行限定来解决范围问题。
3 回答
![?](http://img1.sycdn.imooc.com/545864490001b5bd02200220-100-100.jpg)
米脂
TA贡献1836条经验 获得超3个赞
BarFunc
#include <iostream>class streamable {};std::ostream &operator<<(std::ostream &os, streamable &s) { return os; }class foo_arg_t : public streamable {};class a_arg_t : public streamable {};class b_arg_t : public streamable {};template <class T>class Foo {public: Foo (const foo_arg_t foo_arg) : _foo_arg(foo_arg) { /* do something for foo */ } T Foo_T; // either a TypeA or a TypeB - TBD foo_arg_t _foo_arg;};template <class T>class Bar : public Foo<T> {public: Bar (const foo_arg_t bar_arg, const a_arg_t a_arg) : Foo<T>(bar_arg) // base-class initializer { Foo<T>::Foo_T = T(a_arg); } Bar (const foo_arg_t bar_arg, const b_arg_t b_arg) : Foo<T>(bar_arg) { Foo<T>::Foo_T = T(b_arg); } void BarFunc ();};template <class T>void Bar<T>::BarFunc () { std::cout << _foo_arg << std::endl; std::cout << Bar<T>::_foo_arg << std::endl; }int main(){ Bar<a_arg_t> *b = new Bar<a_arg_t>(foo_arg_t(), a_arg_t()); b->BarFunc();}
![?](http://img1.sycdn.imooc.com/54586431000103bb02200220-100-100.jpg)
炎炎设计
TA贡献1808条经验 获得超4个赞
_foo_arg
_foo_arg
// solution#1std::cout << this->_foo_arg << std::endl;
// solution#2std::cout << Foo<T>::_foo_arg << std::endl;
using
:
// solution#3template <class T>class Bar : public Foo<T> {public: ... void BarFunc ();private: using Foo<T>::_foo_arg;};template <class T>void Bar<T>::BarFunc () { std::cout << _foo_arg << std::endl; // works}
- 3 回答
- 0 关注
- 509 浏览
添加回答
举报
0/150
提交
取消