'using' gcc 中的关键字
'using' keyword in gcc
我得到了两个包含相同var名称('aa')的结构('AAA'和'BBB'),以及通过多重继承使用这两个结构定义的第三个结构('CC')。[这两个结构应该是不相关的,所以当两个类有一个共同的祖先时,这不是著名的钻石问题]。对于派生结构"CCC",我试图显式选择使用派生结构"AAA"中的var,但gcc仍然抱怨定义不明确。为什么?
struct AAA { int aa; };
struct BBB { int aa; };
struct CCC : public AAA , public BBB { using AAA::aa; };
int main() { CCC ccc; return ccc.aa; }
给出:
x.cpp: In function 'int main()':
x.cpp:4:34: error: request for member 'aa' is ambiguous
x.cpp:2:18: error: candidates are: int BBB::aa
x.cpp:1:18: error: int AAA::aa
它失败了,因为aa已经在该范围内。using AAA.aa
只会让它再次进入作用域。
您可以将其强制转换为类型并以这种方式提取它。
#include <iostream>
struct AAA {
int aa;
AAA() : aa(1) {}
virtual ~AAA(){};
};
struct BBB {
int aa;
BBB() : aa(5) {}
virtual ~BBB(){};
};
struct CCC : public AAA , public BBB
{
CCC() : AAA(), BBB() {}
// using AAA::aa;
};
int main()
{
CCC ccc;
std::cout << static_cast<BBB*>(&ccc)->aa << std::endl;
}
尽管如果你打算做很多事情,那么封装这个功能可能会更容易。
//member of CCC
int get_aa()
{
return static_cast<BBB*>(this)->aa;
}
您可以设置指向相关成员的指针:
struct AAA { int aa; };
struct BBB { int aa; };
struct CCC : public AAA , public BBB {
int *A_aa; int *B_aa;
CCC():
A_aa(&static_cast<AAA*>(this)->aa),
B_aa(&static_cast<BBB*>(this)->aa) { }
};
int main() { CCC ccc; return *ccc.A_aa; }
您可以使用虚拟继承。例如,这个代码应该以这种方式重写:
struct AAA { int aa; };
struct BBB { int aa; };
struct CCC : virtual public AAA , virtual public BBB { using AAA::aa; };
相关文章:
- 是否建议在函数中使用using关键字
- 如何使用 "using" 关键字定义函数原型/签名
- C++使用 using 关键字键入别名
- C++带有 using 关键字和参数包的模板函数
- 在 C++ 中,在以下情况下"using"如何使用关键字?
- 如何将"using"关键字用于可变参数模板
- 如何在C++中使用"using"关键字
- 使用 "using" 关键字继承基类的复制和移动构造函数
- 在纯虚函数上应用 "using" 关键字C++
- C++- "using"关键字或使用带有范围解析运算符的命名空间名称
- 使用 "using" 关键字作为伪预处理器
- 如何在方法中使用 make "using" 关键字以接受它作为类级别
- "using"关键字在 c++ 中究竟有什么作用?
- 在 C++ 中使用关键字 using 声明模板化函数指针的语法
- 智能指针删除器和"using"名称为"pointer"关键字
- C++中"using"关键字背后的逻辑是什么?
- 撤消按关键字隐藏的名称"using"。在孙子班不工作
- C++11`using`关键字:专门化模板参数的模板别名
- "using" C++标头实现中的关键字
- C++中的关键字"using"可以与"namespace"以外的内容一起使用吗?