gpt4 book ai didi

c++ - 具有完整类型信息的循环依赖

转载 作者:太空狗 更新时间:2023-10-29 21:19:13 24 4
gpt4 key购买 nike

我有 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;
};

我不知道这是如何工作的,但是当我尝试通过 typedef 公开数组或字典中的某些属性(并在 DeferredContainer 中使用它们)时,我收到错误消息:

error C2602: 'DeferredContainer::value_type' is not a member of a base class of 'DeferredContainer'

我能以某种方式使它工作吗?还有其他想法吗?


31 月 5 日下午 4:09 更新。

我已将问题减少到最低限度。希望这最终能引起重视。 code .

将 MixedArrayObjectPtr 切换为 DeferredContainer 后,代码将无法再编译。

最佳答案

我建议重新排序您的代码,以确保所有定义都按照它们使用的顺序排列。我们必须使用 Object* 而不是 Object 因为 variant 需要有完整的类型:

// main types
class Dictionary;
class Array;
template <typename T> struct DeferredContainer;

using DictionaryPtr = DeferredContainer<Dictionary>;
using ArrayPtr = DeferredContainer<Array>;

struct Object;

// now definitions of them
class Dictionary
{
public:
typedef int value_type;
std::map<Name, Object*> list; // note Object*
};

class Array
{
public:
typedef int value_type;
std::vector<Object*> list; // note only one type here
};

template <typename T>
struct DeferredContainer
{
// now can do stuff with T::value_type
};

在所有这些之后,我们可以声明Object。不幸的是,我们不能转发声明别名,但我们可以将 variant 包装起来:

struct Object {
boost::variant<
DictionaryPtr,
ArrayPtr
> value;
};

有了这个顺序,一切都会编译。

关于c++ - 具有完整类型信息的循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28070143/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com