C++ 处理std::variant中的循环依赖

C++ 处理std::variant中的循环依赖,c++,c++17,circular-dependency,variant,C++,C++17,Circular Dependency,Variant,我试图在以下场景中处理循环依赖: 我有一个std::变体,比如: //types.h 使用类型=std::variant; SomeClass是一个非常简单的东西,只包含几个指针,带有一些模板逻辑: #someclass.h 上课{ //几个简单成员(指针和整数) void use(Types arg);//注意这里的类型用法 模板//隐式假设T==Ts..==Types 无效使用(T参数,Ts…尾部){ 使用(arg); 使用(尾部…); } SomeClass(const SomeClas

我试图在以下场景中处理循环依赖:

我有一个std::变体,比如:

//types.h
使用类型=std::variant;
SomeClass是一个非常简单的东西,只包含几个指针,带有一些模板逻辑:

#someclass.h
上课{
//几个简单成员(指针和整数)
void use(Types arg);//注意这里的类型用法
模板//隐式假设T==Ts..==Types
无效使用(T参数,Ts…尾部){
使用(arg);
使用(尾部…);
}
SomeClass(const SomeClass&)=default;//工作正常
};
通常我会在“使用类型…”之前前向声明某个类,但在涉及std::variant时就不能这样做。我也没有真正找到一种方法来向前声明“using”指令

我发现的一种方法是向前声明SomeClass,并在类型中使用指向它的指针,但我不喜欢这种想法(SomeClass是一个非常轻的对象,生命周期很短,我想让它远离堆)

< C++中还有其他方法(除了指针)来解决这个问题吗?我的点子快用完了

谢谢:)

编辑:

只有在我试图在真正定义某个类之前使用类型时,才会出现此问题,请参见中的,您只需在
SomeClass
之后定义
SomeStruct

这样,当定义了
SomeStruct
时,您的
类型
变体将不再具有任何不完整的类型。换句话说,顺序如下:

class-SomeClass;
使用类型=std::variant;
上课{
//…//此处使用的类型,但不需要具有所有完整的类型
};
结构SomeStruct{
类型价值;
// ...
};

std::variant
中使用前向声明的
SomeClass
时,您到底面临什么问题?。编译得很好(在修复了明显的拼写错误和缺少的include之后)。我认为这种转发声明没有问题。不管你的问题是什么,一定是别的。如果您使用的是另一个编译器,可能是一个编译器错误。我已经设法重现了它,它与循环依赖项或变体无关。将
SomeStruct
的定义移动到
SomeClass
之后。您不能简单地声明类型尚未定义的类成员<代码>B类;A类{B;};B类{}--出于同样的原因,这也不起作用。