这个问题是对以下问题的进一步推进这个线程 https://stackoverflow.com/questions/1117693/initializing-template-base-class-member-types-in-derived-class-initializer-lists.
使用以下类定义:
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
。有办法避免这种情况吗? “using”语句/指令可以在模板类方法中发挥作用来简化代码吗?
Edit:
通过使用 this-> 语法限定变量来解决范围问题。
您可以使用this->
明确您指的是班级成员:
void Bar<T>::BarFunc () {
std::cout << this->_foo_arg << std::endl;
}
或者,您也可以使用“using
”方法中:
void Bar<T>::BarFunc () {
using Bar<T>::_foo_arg; // Might not work in g++, IIRC
std::cout << _foo_arg << std::endl;
}
这使编译器清楚地知道成员名称取决于模板参数,以便它在正确的位置搜索该名称的定义。欲了解更多信息,另请参阅C++ Faq Lite 中的此条目 https://isocpp.org/wiki/faq/templates#nondependent-name-lookup-members.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)