有没有办法在 C++ 中声明循环类型别名

问题描述 投票:0回答:1

我有一段代码看起来像

class Something {};
using MyUnionType = std::variant<A, B>;
using A = Something;
using B = std::vector<MyUnionType>;

但这不编译,我明白了

error: use of undeclared identifier 'A'
在 MyUnionType 的声明中

error: use of undeclared identifier 'MyUnionType'
在B.

的声明中

有没有办法声明这些类型(别名),或者 C++ 不够先进,无法做到这一点?

我尝试如下转发声明 A 和 B

class Something {};
class A;
class B;
using MyUnionType = std::variant<A, B>;
using A = Something;
using B = std::vector<MyUnionType>;

但这也不编译。

error: typedef redefinition with different types ('Something' vs 'A')

error: typedef redefinition with different types ('std::vector<MyUnionType>' (aka 'vector<variant<A, B>>') vs 'B')

当我尝试将 MyUnionType 的声明移动到底部并改为转发声明 MyUnionType 时,我得到了类似的错误。

c++ c++20 typedef using type-declaration
1个回答
0
投票

如果你想引用类本身,你必须定义一个新类型。

#include <variant>
#include <vector>
struct Something {};
struct MyUnionType;
using A = Something;
using B = std::vector<MyUnionType>;
struct MyUnionType {
    std::variant<A, B> v;
};
© www.soinside.com 2019 - 2024. All rights reserved.