gpt4 book ai didi

c++ - 使用模板访问 C++ 中父类(super class)的 protected 成员

转载 作者:IT老高 更新时间:2023-10-28 12:30:52 24 4
gpt4 key购买 nike

为什么 C++ 编译器不能识别 g()bSuperclass 的继承成员如这段代码所示:

template<typename T> struct Superclass {
protected:
int b;
void g() {}
};

template<typename T> struct Subclass : public Superclass<T> {
void f() {
g(); // compiler error: uncategorized
b = 3; // compiler error: unrecognized
}
};

如果我简化 Subclass并且只是从 Subclass<int> 继承然后它编译。它在完全符合条件时也会编译 g()作为 Superclass<T>::g()Superclass<T>::b .我正在使用 LLVM GCC 4.2。

注意:如果我制作 g()b public 在父类(super class)中它仍然失败并出现同样的错误。

最佳答案

这可以通过使用 using 将名称拉入当前范围来修改。 :

template<typename T> struct Subclass : public Superclass<T> {
using Superclass<T>::b;
using Superclass<T>::g;

void f() {
g();
b = 3;
}
};

或者通过 this 限定名称指针访问:

template<typename T> struct Subclass : public Superclass<T> {
void f() {
this->g();
this->b = 3;
}
};

或者,正如您已经注意到的,通过限定全名。

之所以有必要这样做是因为 C++ 没有考虑父类(super class)模板来进行名称解析(因为它们是从属名称并且不考虑从属名称)。使用 Superclass<int> 时有效因为那不是模板(它是模板的实例化),因此它的嵌套名称不是依赖的名称。

关于c++ - 使用模板访问 C++ 中父类(super class)的 protected 成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4010281/

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