模板类范围内的递归变量定义给出了不完整的类型错误,为什么

Recursive variant definition within template class scope gives incomplete type error, why?

本文关键字:类型 错误 为什么 范围内 递归 变量 定义      更新时间:2024-09-28

我试图将本文改编为我的上下文,其中递归变体应该在模板类的范围内定义。

将一切简化到极致,这给了我以下代码片段:

#include <variant>
struct LiteralExpr
{
int value;
};
template <typename T>
struct BaseSpace
{
struct AddExpr;
struct AddExprBox
{
const AddExpr &_impl;
public:
AddExprBox(const AddExpr &obj) {}
};
using Expr = std::variant<AddExprBox, LiteralExpr>;
struct AddExpr
{
std::variant<AddExprBox, LiteralExpr> lhs;
};
};
auto main() -> int
{
auto expr = BaseSpace<int>::Expr(LiteralExpr{2});
}

遗憾的是,这未能在clang上编译,并出现以下错误:

main.cpp:22:47:错误:字段具有不完整的类型"std::variant<AddExprBox,LiteralExpr>'std::变体<AddExprBox,LiteralExpr>lhs;

如果:

  • 我删除了AddExprBox中的复制构造函数,它会编译
  • 我将Basespace设为";非模板";类,它编译
  • 我显式实例化`BaseSpace,它编译

知道为什么会发生这种行为吗?如何修复?

知道为什么会发生这种行为吗?

这似乎是一个gcc和clang错误,因为程序结构良好。特别是,gcc和clang生成的错误(说lhs的类型不完整(似乎是不正确的。

还要注意,该程序在msvc中运行良好。MSVC工作演示。


如何修复?

该程序在技术上没有任何问题。

gcc错误报告提交为:

GCC拒绝涉及std::不变量表示不完整类型的有效程序