1

次のC++コードをコンパイルすると:

#include "ConstantList.h"

using namespace std;

int main() {

ConstantList* cl = new ConstantList();

//do something with cl

delete cl;
cl = NULL;

return 0;
}

コンパイラは私にエラーを出します:

Undefined symbols:
  "ConstantList::~ConstantList()", referenced from:
      _main in ccNfeeDU.o
  "ConstantList::ConstantList()", referenced from:
      _main in ccNfeeDU.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

オブジェクトをインスタンス化するための構文が正しくありませんか?私のConstantList.hファイルは次のようになります。

#ifndef ConstantList_h
#define ConstantList_h

#include <string>
#include "Token.h"


using namespace std;

class ConstantListTail;

class ConstantList {
public:
    ConstantList();
    ~ConstantList();

    std::string toString();

    void push_back(Token*);
    void push_back(ConstantListTail*);

private:
    Token* termString;
    ConstantListTail* constantListTail;
};



#endif

どんな助けでも大歓迎です!

4

2 に答える 2

5

コンパイラエラーではなくリンカエラーが発生するため、構文は正しいです。このエラーはmain、のソースなしでコンパイルしているConstantList.cppか、への参照なしでリンクしていることを意味しますConstantList.o

このコマンドでコンパイルすると、エラーが修正されます。

g++ collect2.cpp ConstantList.cpp

(私はあなたのmain関数を含むファイルが呼び出されると仮定していますcollect2.cpp)。

于 2013-02-22T17:28:44.677 に答える
2

「未定義のシンボル」とは、識別子(この場合はデストラクタ)を宣言し、それが使用されていることを意味しますが、リンカが認識している限り、定義されていません。

どこかに定義を追加し、コンパイルされたバージョンがリンカーがリンクするファイルの1つにあることを確認します


「インスタンス化の構文」に関しては、残念ながら、C++には専用の構文はありません。

代わりに、コンストラクターの呼び出しに機能キャスト表記が使用されます

おそらく、純粋なインスタンス化構文に最も近いのは、次のnew式です。


using namespace std;

ヘッダーファイル内:しないでください。

たとえば、標準ライブラリは。と呼ばれるものを定義しますdistance。ヘッダーを含む一部のコードが独自のを持ちdistance、名前が衝突する可能性はどのくらいありますか?ゼロよりはるかに高い。

これは、ヘッダーファイルに含めるべきではないという意味ではありませんがusing namespace std;、ヘッダーファイルのグローバル名前空間に含めるべきではありません。また、他の名前空間については、それが何をするのか、つまり、その名前空間の一部としてすべての標準ライブラリ名を提供することに十分注意してください。

于 2013-02-22T17:30:59.733 に答える