2016-05-13 44 views
0

我想在YACC文件中添加结构工会,但我发现这个错误:结构工会C++ YACC

"error : member 'Info YYSTYPE ::info' with constructor not allowed in union "

%{ 
#include <cstdio> 
#include <iostream> 
using namespace std; 

extern "C" int yylex();       
extern "C" int yyparse();    
extern "C" FILE *yyin;     
struct Info{ int intval; float floatval; string stringval ;int type; } 

void yyerror(const char *s); 
%} 

%union { 

int ival; 
float fval; 
char *sval; 

struct Info info; 

} 
+0

错误告诉你几乎到底是什么问题:C++不允许你在联合中使用一个构造函数(非POD类型)。没有什么特别与yacc有关。 –

+0

[...与构造函数不允许在联合问题中可能重复](http://stackoverflow.com/questions/6014717/with-constructor-not-allowed-in-union-problem) – Schore

回答

1

你不能把非POD结构的工会在C++中,因为编译器无法告诉哪个联合成员构建或破坏。

一种替代方法是在联合使用指针:

在这种情况下
%union { 
    ... 
    Info *info; 
}; 

你必须要小心明确删除指针,如果/当他们不再需要。如果出现错误,野牛的%destructor在这里可以用来避免泄漏。

或者,不使用%union在所有 - 只是定义YYSTYPE作为一个单一的类型:

%{ 
#define YYSTYPE struct Info 
%} 

在这种情况下,所有的规则需要使用相同类型的(没有%type声明有不同的规则产生不同的东西)。类似boost::variant可以是有用的,如果你真的需要有不同的类型..

0

我看不到同时使用同一个成员的联合和结构的观点。你应该使用一个或另一个。

如果您告诉野牛发出C++解析器,您可以选择使用类似变体的语义类型。无论是C还是C++解析器,都可以使用联合或结构,但在任何情况下,您都可以将C++ std::string作为联合成员,甚至间接地包含该错误消息中指出的原因。这与野牛很少有关系;除非联合本身具有构造函数,否则C++不会让你定义具有构造函数的成员的联合。 (如果你试图编写所需的构造函数,你可能会明白为什么语言没有办法为你做。)

如果你不想乱用内存管理,野牛的变种选项可能是为你。阅读手册中的文档。否则,可以使用指向std::string(使用new运算符创建)的指针,也可以只使用C字符串。在这两种情况下,您都需要分配和释放存储空间。

0

联盟只允许您使用原始类型和指针。

如果您需要使用结构,那么在联合中,您只能声明指向该结构的指针。