4

「C2143: 構文エラー: ';' がありません」というエラーが表示されます。Track.h の '*' の前に、これは「欠落している」クラス定義によるものだと思います。

これらは 3 つのヘッダー ファイルです。

他のすべてを #include するパッケージ レベルのヘッダー ファイル、Topics.h:

#ifndef Topics_H
#define Topics_H

#include <oxf\oxf.h>
#include "Request.h"
#include "TDPoint.h"
#include "Track.h"
#include "TrackReport.h"

#endif

次に、TDPoint (「3DPoint」のように) があります。これは、3 つの long 属性を持つクラスを単純に定義します。

#ifndef TDPoint_H
#define TDPoint_H

#include <oxf\oxf.h> // Just IBM Rational Rhapsody's Framework
#include "Topics.h"

class TDPoint {
    ////    Constructors and destructors    ////

public :

    TDPoint();

    ~TDPoint();

    ////    Additional operations    ////

long getX() const;    
void setX(long p_x);
long getY() const;    
void setY(long p_y);    
long getZ() const;
void setZ(long p_z);

    ////    Attributes    ////

protected :

    long x;    
    long y;    
    long z;};

#endif

しかし、問題はここのマークされた行にあります。

#ifndef Track_H
#define Track_H

#include <oxf\oxf.h> // Just IBM Rational Rhapsody's Framework
#include "Topics.h"
#include "TDPoint.h"

class Track {

public :

    ////    Operations     ////

    std::string getId() const;

    void setId(std::string p_id);

    TDPoint* getPosition() const; // <--- This line, the first line to use TDPoint, throws the error

    ////    Attributes    ////

protected :

    std::string id;   

    TDPoint position;

public :

     Track();
     ~Track();
};

#endif

私の推測では、コンパイラ (MS VS2008/ MSVC9) は単にクラス "TDPoint" を認識していなかったのです。しかし、"Track" と同じヘッダー ファイルでクラスを定義したり、"class TDPoint" のような前方宣言を使用したりしても (エラー: undefined class がスローされます)、役に立ちませんでした。コードは Rhapsody から自動生成されたものです (違いがある場合)。

しかし、おそらくエラーはまったく別のものですか?

4

3 に答える 3

5

循環的なインクルードがあります: ファイルには、クラスが宣言されていない場所で、どのインクルードがTrack.h含まれているかが含まれてTopics.hいます。TDPoints.hTopics.hTrack.hTDPoint

実際、TDPoint.hヘッダーファイルはまったく必要ありません。完全に独立しています(質問に示されているコードに従って)。

Track.hファイルにはTDPoint.h、 ではなく、のみを含める必要がありTopics.hます。(そしておそらく<string>。)

一般的なヒント: ヘッダー ファイルに含めるヘッダーはできるだけ少なくしてください。

于 2014-03-12T12:34:40.103 に答える
1

他の答えは正しいですが、完全を期すためにいくつか追加したいと思います。

1. 原因:プロジェクトに循環インクルードがあります。具体的には、「TDPoint.cpp」をコンパイルすると、コンパイラは次のことを行います。

#include "TDPoint.h" //start compiling TDPoint.h
#include "Topics.h" //start compiling Topics.h
#include "TDPoint.h" //compilation of TDPoint.h skipped because it's guarded
#include "Track.h" //start compiling Track.h
#include "Topics.h" //compilation of Topics.h skipped because it's guarded
 //resume compiling Track.h 
... 
TDPoint* getPosition() const; //=> error TDPoint is not defined

=>C2143: syntax error: missing ';' before '*' 

2. 対策:ヘッダー内のインクルードを前方宣言に置き換えて、インクルードの循環を削除し、.cpp ファイルでインクルードを使用します。具体的には、前方宣言の意味: (Topics.h 内)

#ifndef Topics_H
#define Topics_H
#include <oxf\oxf.h>
#include "Request.h"
class TDPoint;  //Forward declaration to replace #include "TDPoint.h"
class Track; //Forward declaration to replace #include "Track.h"
#include "TrackReport.h"
#endif
于 2019-08-07T09:50:10.440 に答える