2016-07-04 4 views
0

определения типов Этот код не компилировать:Круговые

class B; 
class A{ 
    typedef int AThing; 
    typedef B::BThing BThing; 
}; 
class B{ 
    typedef int BThing; 
    typedef A::Athing AThing; 
}; 

Поскольку A нуждается в typedef от B и B необходим один из A.

Каков типичный метод использования typedefs с круговой зависимостью?

+1

не дубликат IMO, здесь нет заголовка, не говоря уже о круговых зависимостях в заголовке. –

+0

Не знаю, почему я не могу ответить, так что сделаю это здесь. Это, безусловно, не дублирование, а довольно сложный вопрос! Этот случай можно решить, добавив еще один уровень косвенности: [см. Демонстрацию] (https://godbolt.org/g/jx5IC9). Я столкнулся с одним и тем же случаем, и сейчас я ищу более общее и полезное решение. – Trollliar

+0

@Trollliar Это интересный способ решения этой проблемы. – DarthRubik

ответ

2

Типичное решение для наличия круговых typedef зависимостей такого типа не должно иметь круглых typedef зависимостей такого рода. Эти виды круговых typedef зависимостей не могут быть сделаны в C++, так что вы должны изменить свою иерархию классов:

class B; 

typedef int this_is_a_BThing; 

class A{ 
    typedef int AThing; 
    typedef this_is_a_Bthing BThing; 
}; 
class B{ 
    typedef this_is_a_BThing BThing; 
    typedef A::Athing AThing; 
}; 
+0

Это воняет ... о хорошо – DarthRubik

0

Каков типичный способ использования определений типов, которые имеют круговые зависимостей?

Нет такого типичного метода, вы не можете этого сделать.

Для случаев, когда вы можете использовать форвардные декларации и расширять зависимые typedefs в области типов, см. Ответы от Resolve header include circular dependencies in C++.

Случай, который вы вводите в области видимости класса , не имеет особого значения в связи с тем, что компилятор не может решить его, увидев переднее объявление.


Единственный способ, которым я могу думать об использовании определений типов является использование Pimpl Idion и фактически ввести их только в реализации.

+0

Это не дубликат ..... это отдельный вопрос полностью – DarthRubik

Смежные вопросы