c++ - 如何转发声明依赖于变体定义的类,而后者又依赖于模板类?
问题描述
我有一个名为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>
商店 aT
作为成员。
几个月前我遇到了类似的问题。我有一个这样的设计,其中一个替代方案是 a vector<T>
,这很好,因为vector<T>
即使T
不是完整的……但我不相信你的情况Fum<T>
是这样,当我开始时也不是这样尝试使用其他一些容器。
如果Fum
改为存储一些指针,并动态分配它T
,你会没事的。