C++ 为什么我的结构不能有boost::variant类型的成员,但可以有vector类型的成员<;boost::variant>;?
我定义了以下boost::variant类型: 但是,上面所写的结构将不会编译,从而产生错误页面(此处包含的错误太多),主要与“不允许不完整类型”有关 第一个编译器错误是:C++ 为什么我的结构不能有boost::variant类型的成员,但可以有vector类型的成员<;boost::variant>;?,c++,boost,boost-variant,incomplete-type,C++,Boost,Boost Variant,Incomplete Type,我定义了以下boost::variant类型: 但是,上面所写的结构将不会编译,从而产生错误页面(此处包含的错误太多),主要与“不允许不完整类型”有关 第一个编译器错误是: In file included from ./apps/iv_parserTest.cc(1): /opt/common/boost/1.50.py2.7/include/boost/mpl/sizeof.hpp(27): error: incomplete type is not allowed : mpl::size
In file included from ./apps/iv_parserTest.cc(1):
/opt/common/boost/1.50.py2.7/include/boost/mpl/sizeof.hpp(27): error: incomplete type is not allowed
: mpl::size_t< sizeof(T)>
包含在./apps/iv_parserTest.cc(1)中的文件中:
/opt/common/boost/1.50.py2.7/include/boost/mpl/sizeof.hpp(27):错误:不允许不完整的类型
:mpl::size\u t
但是,如果我将结构更改为以下内容,则它编译时不会出现问题:
struct SharedNodeType {
std::string nodeName;
std::vector<BaseNodeType> node;
};
struct SharedNodeType{
std::字符串节点名;
std::向量节点;
};
由于我的SharedNodeType
将永远不会有多个节点,这对我来说似乎是浪费
为什么结构的第二种形式会被编译,而第一种形式不会
编辑:
在进行了更多的实验之后,我确定问题似乎在于BaseNodeType变量类型也包含SharedNodeType。我已经相应地更新了我的代码示例,但仍然存在这样一个问题:如果类型位于
std::vector
中,为什么编译器能够解析这些类型,而不是其他类型。使用类型作为成员要求它是完整的(显然,因为需要知道大小)
因此出现了catch-22(变体的大小取决于SharedNodeType的大小,反之亦然)
你需要打破依赖循环
偶然解 当您使用
std::vector
intead ofBaseNodeType
时,遇到了一个意外的解决方法/解决方案,您的特定库实现非常/意外地支持这一点
据我所知,这从来都不是标准库容器所必需的特性,事实上我想我记得规范要求值类型在实例化时是完整的
现在,通过切换到Boost容器的vector
模板(Boost::containers::vector
),您仍然可以可靠地使用此解决方案,该模板明确支持不完整类型的实例化
Surefire解决方案
boostvariant有自己的功能来处理不完整的类型,特别是创建(可能的)递归变量类型
您的原始样本如下所示,已修复:
#include <boost/variant.hpp>
#include <vector>
#include <string>
struct SharedNodeType;
typedef float TypeA;
typedef int TypeB;
typedef std::string TypeC;
typedef char* TypeD;
typedef boost::variant<TypeA, TypeB, TypeC, TypeD, boost::recursive_wrapper<SharedNodeType> > BaseNodeType;
struct SharedNodeType
{
std::string nodeName;
BaseNodeType node;
};
int main() {
BaseNodeType bnt;
SharedNodeType snt;
}
#包括
#包括
#包括
结构SharedNodeType;
typedef-float-TypeA;
typedef int TypeB;
typedef std::字符串TypeC;
typedef char*类型化;
typedef boost::variant BaseNodeType;
结构SharedNodeType
{
std::字符串节点名;
BaseNodeType节点;
};
int main(){
碱基型bnt;
共享模式snt;
}
使用类型作为成员要求它是完整的(显然,因为需要知道大小)
因此出现了catch-22(变体的大小取决于SharedNodeType的大小,反之亦然)
你需要打破依赖循环
偶然解 当您使用
std::vector
intead ofBaseNodeType
时,遇到了一个意外的解决方法/解决方案,您的特定库实现非常/意外地支持这一点
据我所知,这从来都不是标准库容器所必需的特性,事实上我想我记得规范要求值类型在实例化时是完整的
现在,通过切换到Boost容器的vector
模板(Boost::containers::vector
),您仍然可以可靠地使用此解决方案,该模板明确支持不完整类型的实例化
Surefire解决方案
boostvariant有自己的功能来处理不完整的类型,特别是创建(可能的)递归变量类型
您的原始样本如下所示,已修复:
#include <boost/variant.hpp>
#include <vector>
#include <string>
struct SharedNodeType;
typedef float TypeA;
typedef int TypeB;
typedef std::string TypeC;
typedef char* TypeD;
typedef boost::variant<TypeA, TypeB, TypeC, TypeD, boost::recursive_wrapper<SharedNodeType> > BaseNodeType;
struct SharedNodeType
{
std::string nodeName;
BaseNodeType node;
};
int main() {
BaseNodeType bnt;
SharedNodeType snt;
}
#包括
#包括
#包括
结构SharedNodeType;
typedef-float-TypeA;
typedef int TypeB;
typedef std::字符串TypeC;
typedef char*类型化;
typedef boost::variant BaseNodeType;
结构SharedNodeType
{
std::字符串节点名;
BaseNodeType节点;
};
int main(){
碱基型bnt;
共享模式snt;
}
请显示a。当您执行BaseNodeType节点时,TypeA、TypeB、TypeC、TypeD是否已知代码>?引发的实际编译器错误是什么?@NathanOliver是。所有这些类型都是完整的。我已经更新了代码和问题,使之更清楚。可能相关。请显示a。当您执行BaseNodeType节点时,是否知道TypeA、TypeB、TypeC、TypeD
代码>?引发的实际编译器错误是什么?@NathanOliver是。所有这些类型都是完整的。我已经更新了代码和问题,使之更清楚。可能是相关的。
#include <boost/variant.hpp>
#include <vector>
#include <string>
struct SharedNodeType;
typedef float TypeA;
typedef int TypeB;
typedef std::string TypeC;
typedef char* TypeD;
typedef boost::variant<TypeA, TypeB, TypeC, TypeD, boost::recursive_wrapper<SharedNodeType> > BaseNodeType;
struct SharedNodeType
{
std::string nodeName;
BaseNodeType node;
};
int main() {
BaseNodeType bnt;
SharedNodeType snt;
}