3

这是我需要做的:

#include <iostream>                                                                                                                                                                                              

using namespace std;

class A
{
    public :
    virtual void fa() = 0;
};

template <typename type>
class B : public A
{
    protected :
    int v_b;
};

template <typename type>
class C : public B<type>
{
    public :
    void fa()
    {
        // whatever action that try to access v_b
        cout << "v_b = " << v_b << endl;
    }
};

int main()
{
    C<int> toto;
    toto.fa();
    return 0;
}

这是 g++ 输出:

test.cpp: In member function ‘void C<type>::fa()’:
test.cpp:25:29: error: ‘v_b’ was not declared in this scope

据我了解,v_b 是 B 的受保护成员,因此可以在 C 中访问。A 和 B 都是抽象类,我需要在 C 类中重写 A 的 f_a() 方法才能实例化它。因为编译器告诉我这个

test.cpp: In member function ‘void C<type>::fa()’:

不是

‘void A::fa()’:

我不明白为什么 v_b 变量不在范围内。这是我使用模板方式的问题吗?

谁能帮我解决这个问题?

谢谢

编辑 :

我尝试按照此处的建议使用 this->v_b 或 B<type>::v_b并且效果很好!谢谢你的帮助

4

1 回答 1

3

在表达式中:

    cout << "v_b = " << v_b << endl;

v_b是一个非依赖表达式(即它看起来不像依赖于模板参数。对于非依赖表达式,第一阶段查找必须解析符号,并且它会通过仅在非依赖上下文中查找来做到这一点。这个不包括模板基(因为它确实取决于类型参数)。简单的解决方法是使用 限定调用this

    cout << "v_b = " << this->v_b << endl;

现在它是一个依赖表达式(this这显然取决于实例化类型),并且查找被延迟到第二阶段,其中类型被替换并且可以检查基数。

于 2012-06-29T22:48:09.660 回答