gpt4 book ai didi

c++ - 对基类成员数据的派生模板类访问

转载 作者:IT老高 更新时间:2023-10-28 13:23:41 25 4
gpt4 key购买 nike

这个问题是对 this thread 中提出的问题的推进。 .

使用以下类定义:

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' 语句/指令能否在模板类方法中发挥作用以简化代码?

编辑:

通过使用 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;
}

这使编译器清楚地知道成员名称取决于模板参数,以便它在正确的位置搜索该名称的定义。如需更多信息,请参阅 this entry in the C++ Faq Lite .

关于c++ - 对基类成员数据的派生模板类访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1120833/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com