Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我的结构不能有boost::variant类型的成员,但可以有vector类型的成员<;boost::variant>;?_C++_Boost_Boost Variant_Incomplete Type - Fatal编程技术网

C++ 为什么我的结构不能有boost::variant类型的成员,但可以有vector类型的成员<;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

我定义了以下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_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 of
BaseNodeType
时,遇到了一个意外的解决方法/解决方案,您的特定库实现非常/意外地支持这一点

据我所知,这从来都不是标准库容器所必需的特性,事实上我想我记得规范要求值类型在实例化时是完整的

现在,通过切换到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 of
BaseNodeType
时,遇到了一个意外的解决方法/解决方案,您的特定库实现非常/意外地支持这一点

据我所知,这从来都不是标准库容器所必需的特性,事实上我想我记得规范要求值类型在实例化时是完整的

现在,通过切换到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;
}