0

yacc.yにstructerrorStructとキュー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

アップデート

最初:
Node.h//ノードクラス
yacc.yの場合//ルール+errorStruct+キューerrQueue+クラスErrList:「Node.h」と<キュー>を含む

それから:

Node.h//ノードクラス+errorStruct+キューerrQueue+クラスErrList:includes <queue>
yacc.y //ルール:includes "Node.h"

アップデート

Node.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の残りの部分は、クラスErrListまたはerrQueueの宣言を
使用せずに使用するだけで、yacc.yのこのクラスとは何の関係もありません。
se->pushError(...);

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宣言は、ヘッダー (yacc.h) に加えて cc ファイルのいずれかで宣言されている場合、上記の型のインスタンスを作成する必要があるすべての cc ファイルにのみ含まれている必要があります。その後、言及した再定義エラーが発生します。

于 2011-05-16T16:55:50.607 に答える