如何转发声明依赖于变量定义的类,而变体定义又依赖于模板化类?
How to Forward Declare a Class that Relies on a Variant Definition, Which In Turn Relies on a Templated Class?
我有一个名为Foo
的类。我还有一个名为Fum
的模板化类。Fum<Foo>
包含类型为Foo
的数据成员。此外,我有一个变体定义typedef std::variant< Fum<Foo> /* etc.*/ > var_t;
.Foo
包含类型var_t
的数据成员。
如您所见,var_t
取决于Fum
和Foo
,而Foo
取决于var_t
。我可以执行哪些声明序列来编译以下代码:
阅读错误注释
尝试 1:
#include <iostream>
#include <variant>
// Forward Decls
template <typename T>
class Fum;
class Foo;
typedef std::variant< Fum<Foo> /* etc.*/ > var_t;
template<typename T>
class Fum {
private:
// Error: Incomplete type Foo.
T value;
public:
/*
+++++ Construct T object emplace +++++
*/
template<typename ... Params>
Fum<T>(Params&& ... argsOfT)
:value(std::forward<Params>(argsOfT)...)
{}
Fum<T>(Fum<T>&& fumObj)
:value(std::move(fumObj.value))
{}
}; // Fum
class Foo {
private:
var_t val;
public:
Foo(var_t&& valParam)
:val(std::move(valParam))
{}
}; // Foo
尝试 2:
#include <iostream>
#include <variant>
// Forward Decls
template <typename T>
class Fum; // note: template is declared here
class Foo;
typedef std::variant< Fum<Foo> /* etc.*/ > var_t;
class Foo {
private:
var_t val;
public:
Foo(var_t&& valParam)
:val(std::move(valParam))
{}
}; // Foo
template<typename T>
class Fum {
private:
// note: in instantiation of template class
// 'std::__1::variant<Fum<Foo> >' requested here
T value;
public:
/*
+++++ Construct T object emplace +++++
*/
template<typename ... Params>
Fum<T>(Params&& ... argsOfT)
:value(std::forward<Params>(argsOfT)...)
{}
Fum<T>(Fum<T>&& fumObj)
:value(std::move(fumObj.value))
{}
}; // Fum
我认为你不能。
多属性的备选方案必须全部为完整类型,并且您的Fum<T>
将T
存储为成员。
几个月前我遇到了类似的问题。我有这样的设计,其中一个替代方案是vector<T>
,这很好,因为即使T
不是,vector<T>
也是完整的......但我不相信你的Fum<T>
是这种情况,当我开始尝试其他一些容器时,情况并非如此。
如果Fum
而是存储一些指针,并动态分配其T
,那就没问题了。
不可能,因为您有一个没有间接寻址(指针或引用(的循环定义。 因此,所有对象都直接相互包含,最终要求
sizeof(var_t) > sizeof(Fum<Foo>) >= sizeof(Foo) >= sizeof(var_t)
这是不可能的。
相关文章:
- VS 2015 链接错误 无法构建依赖于 libcurl 的项目
- 为什么内存屏障依赖于变量?
- 如何定义依赖于参数包转换的函数的返回类型
- FBString 的小字符串优化是否依赖于未定义的行为?
- 如何转发声明依赖于变量定义的类,而变体定义又依赖于模板化类?
- 如何定义具有依赖于符号调试的参数的函数
- 如何从同一个头文件中定义 2 个类,而一个类依赖于另一个类
- 在全局命名空间中重载不依赖于用户定义类型的标准定义类型的运算符是否格式正确?
- 构建不依赖于MSVCR120.DLL的自定义英特尔 MKL DLL
- 如何定义依赖于模板参数的类型定义
- 链接自身依赖于静态库的静态库时未定义的引用
- 此代码是否依赖于函数调用顺序未定义的行为
- void指针之间的比较,它是定义的还是依赖于编译器的
- 对依赖于参数的查找和友元函数定义的混淆
- 依赖于实现的行为和未定义的行为之间有什么区别吗
- 使用"std::conditional_t"定义依赖于其模板参数的类"typedef"
- 类型定义应该依赖于模板参数
- C++std列表排序使用自定义比较器,该比较器依赖于对象实例的成员变量
- CMake依赖于已定义的(预处理器)头文件
- 如何制作自定义MSBuild目标's的执行依赖于文件's的时间戳