模板类范围内的递归变量定义给出了不完整的类型错误,为什么
Recursive variant definition within template class scope gives incomplete type error, why?
我试图将本文改编为我的上下文,其中递归变体应该在模板类的范围内定义。
将一切简化到极致,这给了我以下代码片段:
#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::不变量表示不完整类型的有效程序
相关文章:
- 类没有命名C++代码中的类型错误
- 不完整类型错误(E0409、E0070、E0515)
- 使用具有结构不完整类型错误的模板
- 不命名构造函数和析构函数上的类型错误
- 返回派生类型时出现协变类型错误
- 为什么此构造函数没有给出不完整的类型错误?
- 定义模板化结构的特征时出现不完整的类型错误
- 使用重载构造函数时出现不完整的类型错误
- 为什么我得到表达式必须有类类型错误?
- 输出 [left]=input[i] 行中的 c++ 代码中存在无效的类型错误
- 枚举成员不是类型错误
- 如何修复"ctypes"。参数错误:参数 2:<键入"异常.类型错误">:RaspberryPi 中的错误类型"错误
- 外部 "C" Visual Studio 2015 中的显式类型错误,DLL 测试代码
- 非默认析构函数会导致不完整的类型错误
- 为什么按引用传入会导致绑定引用类型错误
- Objective-C C++ 包装器 类型错误的不完整定义
- 输入类型错误
- 当构造函数的参数类型错误时引发异常
- 命名空间中的'bad_cast' 'std' 未命名类型错误
- C UNWORKOWN类型错误