У меня есть 2 класса, которые включены в вариант. Вариант затем используется в обоих классах.Циркулярная зависимость с полной информацией о типе
template <typename T>
struct Deferred
{
typedef T value_type;
};
template <typename T>
struct DeferredContainer
{
typedef typename T::value_type value_type;
};
class DictionaryObject;
class MixedArrayObject;
using DictionaryObjectPtr = Deferred <DictionaryObject>; // DeferredContainer<DictionaryObject>
using MixedArrayObjectPtr = Deferred <MixedArrayObject>; // DeferredContainer<MixedArrayObject>
typedef boost::variant <
MixedArrayObjectPtr,
DictionaryObjectPtr
> ContainerPtr;
class MixedArrayObject
{
public:
typedef int value_type;
inline void SetContainer(ContainerPtr obj) { _container = obj; }
inline ContainerPtr GetContainer() const { return _container; }
private:
ContainerPtr _container;
};
class DictionaryObject
{
public:
typedef float value_type;
inline void SetContainer(ContainerPtr obj) { _container = obj; }
inline ContainerPtr GetContainer() const { return _container; }
private:
ContainerPtr _container;
};
Я не знаю точно, как это работает, но когда я пытаюсь раскрыть некоторые свойства на любом массиве или словаре через ЬурейеЕ (и использовать их в DeferredContainer), я получаю сообщение об ошибке:
error C2602: 'DeferredContainer::value_type' is not a member of a base class of 'DeferredContainer'
Могу ли я сделать эту работу как-то? Любые другие идеи?
Обновление 31.5, 16:09.
Я уменьшил проблему до минимума. Надеюсь, это, наконец, привлечет внимание. code.
После того, как вы переключите MixedArrayObjectPtr на DeferredContainer, код больше не будет компилироваться.
Как будет объявлен «T :: value_type» внутри T? – Quentin
Во-первых, 'Dictionary' не имеет определения для' value_type'. Также 'Array', поэтому ваш' typedef' в 'DeferredContainer', вероятно, вызовет несколько проблем. – frasnian
Что вы пытаетесь сделать? Можете ли вы нарисовать схему того, что содержит то, что и что указывает на что? –