【问题标题】:Use a class as type specifier before it is defined在定义之前使用类作为类型说明符
【发布时间】:2022-01-17 08:16:14
【问题描述】:

所以我在std::variant 中使用类的方式有问题。

假设我有以下代码:

// abc.h
#include <variant>

class A
{
public:
    A(std::variant<B, C> data);
};

class B
{
public:
    B(std::variant<A, C> data);
};

class C
{
public:
    A(std::variant<A, B> data);
};

当我尝试使用尚未声明的类时,它会给我类似error C2065: 'NameOfClass': undeclared identifier 的错误。对此有什么好的解决方案?在我的实际项目中,variants 中有相当多的类相互使用。

【问题讨论】:

  • 我很好奇为什么你想要std::variant构造函数参数而不是仅仅重载构造函数?但无论如何,您只需要为BC 添加一些前向声明。
  • @Brian std::variant 会处理不完整的类型吗?
  • @FrançoisAndrieux 嗯,好点。我不知道。估计不会
  • @FrançoisAndrieux 我认为不会。只有明确声明它们可以处理不完整类型的标准库模板才能这样做。
  • @Brian 所以在我的实际项目中,一些类的构造函数包含两个变体类型参数,每个变体由大约 5 - 10 个类型组成,所以我想我不想写这么多的构造函数。我会看看前向声明。

标签: c++ c++17 variant


【解决方案1】:

要创建一个variant&lt;A, B, C&gt;ABC 这三个类都必须是完整的 - 因为否则编译器无法确定变体的大小。

另一方面,您应该能够声明它们;但是到了真正使用VAR的时候,它们都必须是完整的。

class A;
class B;
class C;
using VAR = std::variant<A, B, C>; // a declaration

class A {int a;};
class B {long b;};
class C {double c;};

VAR v; // a definition.

【讨论】:

  • 那么在这种情况下我想要实现的目标是不可能的?是否有可能让编译器知道范围内有哪些类,而不管它们在哪里声明/定义并使用它们?认为 C++ 会比这更聪明。
  • 我们不能用这样的前向声明来声明想要的构造函数,然后再定义它们吗?
猜你喜欢
  • 1970-01-01
  • 2022-01-08
  • 2012-02-09
  • 1970-01-01
  • 2019-01-01
  • 1970-01-01
相关资源
最近更新 更多