0

我在 yacc.y 中有 struct errorStruct 和一个队列 errQueue 定义,然后将其移动到单独的 .h 文件中
,但它给了我链接错误,即在 yacc.obj 和 node.obj 中都找到了该定义!
尝试创建新解决方案但仍然给出相同的错误

Error   9   error LNK2005: "class std::queue<struct errorStruct,class std::deque<struct          

errorStruct,class std::allocator<struct errorStruct> > > errQueue" (?errQueue@@3V?$queue@UerrorStruct@@V?

$deque@UerrorStruct@@V?$allocator@UerrorStruct@@@std@@@std@@@std@@A) already defined in Node.obj    yacc.obj

更新

first :
Node.h // 用于节点类
yacc.y // rules + errorStruct + queue errQueue + class ErrList : 包括 "Node.h" & <queue>

然后:

Node.h // 用于节点类 + errorStruct + 队列 errQueue + 类 ErrList :包括 <queue>
yacc.y // 规则:包括“Node.h”

更新

在节点.h

struct errorStruct{
            int errLineNum;
            int errColNum ;
            char * errMessage;
    };

class ErrList{

public:
void pushError(int line,int col,char * message);
void popError();    
void printErrors();
int getSize();

private :
queue <errorStruct> errQueue;

};
externErrList * se = new ErrList ();

Node.h 的其余部分与 yacc.y 中的此类无关,
只是使用
se->pushError(...);
and 作为类 ErrList 或 errQueue 的声明

4

2 回答 2

0

操作!我忘了发布答案..对不起..

在@Peter K. 的参考资料的帮助下得到了它:

转到VS:项目->属性页->配置属性->链接器->命令行

并添加/FORCE:MULTIPLE附加选项框

于 2011-05-17T08:46:29.937 回答
0

我相信您应该将代码组织为:

yacc.h   //-----> should have declaration of errQueue & errorStruct

yacc.cc  //-----> should include yacc.h, 
//It can create variables of type errQueue & errorStruct

node.cc  //-----> should include yacc.h
//It can create variables of type errQueue & errorStruct

请注意,声明应该只存在于yacc.h并且它应该包含在所有需要创建上述类型实例的 cc 文件中,如果除了标题(yacc.h)之外的任何 cc 文件中声明了结构那么你最终会得到你提到的重新定义错误。

于 2011-05-16T16:55:50.607 回答