C++ ';使用';gcc中的关键字

C++ ';使用';gcc中的关键字,c++,gcc,C++,Gcc,我得到了两个结构('AAA'和'BBB'),其中包含相同的var名称('aa'),第三个结构('CCC'),通过多重继承使用这两个结构定义。 [这两个结构应该是不相关的,所以当两个类有一个共同的祖先时,这不是著名的钻石问题]。 对于派生结构“CCC”,我尝试显式选择使用派生结构“AAA”中的var,但gcc仍然抱怨定义不明确。为什么? struct AAA { int aa; }; struct BBB { int aa; }; struct CCC : public AAA , public

我得到了两个结构('AAA'和'BBB'),其中包含相同的var名称('aa'),第三个结构('CCC'),通过多重继承使用这两个结构定义。 [这两个结构应该是不相关的,所以当两个类有一个共同的祖先时,这不是著名的钻石问题]。 对于派生结构“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已经在该范围内<代码>使用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;
}
#包括
结构AAA{
int aa;
AAA():aa(1){}
虚拟~AAA(){};
};
结构BBB{
int aa;
BBB():aa(5){}
虚拟~BBB(){};
};
结构CCC:公共AAA,公共BBB
{ 
CCC():AAA(),BBB(){}
//使用AAA::aa;
};
int main()
{ 
CCC;
std::cout 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;};
结构BBB{int aa;};
结构CCC:公共AAA,公共BBB{
int*A_aa;int*B_aa;
CCC():
A_aa(&static_cast(本)->aa),
B_aa(&static_cast(this)->aa{}
};
int main(){CCC;return*CCC.A_aa;}
您可以使用。例如,此代码应按以下方式重写:

struct AAA { int aa; };
struct BBB { int aa; };
struct CCC : virtual public AAA , virtual public BBB { using AAA::aa; };

我个人只会用一个不冲突的名字。或者,使用scope resolution操作符,虽然在本例中看起来有点滑稽,但它非常清楚地表达了您想要的内容:
ccc.AAA::aa
。我个人建议不要使用这种方法,因为它不是很习惯用法。我还建议在可能的情况下使用引用而不是指针。使用函数或强制转换(或多或少)是明智的,因为使用它实际上不起作用,使用会将成员带入当前的作用域/命名空间。BBB中的aa和AAA都已在CCC中,using命令不会选择编译器要使用的默认值。只是尝试了一个共享函数(而不是var),而“using”似乎可以完成这项工作。也可以在Visual C++上使用变量进行精细处理
struct AAA { int aa; };
struct BBB { int aa; };
struct CCC : virtual public AAA , virtual public BBB { using AAA::aa; };