ключевое слово 'using' в gcc - PullRequest
4 голосов
/ 05 марта 2012

Я получил две структуры ('AAA' и 'BBB'), содержащие одно и то же имя переменной ('aa') и третью структуру ('CCC'), определенные с использованием обеих через множественное наследование. [Предполагается, что две структуры не связаны, так что это не известная проблема с бриллиантами, когда два класса имеют общего предка]. для производной структуры 'CCC' я пытался явно выбрать работу с var в производной структуре 'AAA', но gcc по-прежнему жалуется на неоднозначную def. почему?

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

Ответы [ 3 ]

5 голосов
/ 05 марта 2012

Сбой, потому что аа уже находится в этой области. 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;
}
0 голосов
/ 05 марта 2012

Вы можете использовать Виртуальное наследование .Для вашего примера этот код должен быть переписан следующим образом:

struct AAA { int aa; };
struct BBB { int aa; };
struct CCC : virtual public AAA , virtual public BBB { using AAA::aa; };
0 голосов
/ 05 марта 2012

Вы можете установить указатели для соответствующих членов:

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; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...