0
#ifndef _MY_OPENCLPLATFORM_
#define _MY_OPENCLPLATFORM_

#include "OpenCL.h"

namespace my
{

    class OpenCLPlatform
    {
        cl_platform_id mplatformID;

        cl_uint mnumDevices;

        std::vector<OpenCLDevice> mdevices; // OpenCLDevice was not declared in this scope

    public:
        OpenCLPlatform(cl_platform_id platformID);

        void getDevices();

        void printInfo();

        cl_platform_id& getPlatformID();
    };
}

#endif

#ifndef _MY_OPENCLDEVICE_
#define _MY_OPENCLDEVICE_
#include "OpenCL.h"

namespace my
{
    class OpenCLDevice
    {
        cl_device_id mdeviceID;

    public:
        OpenCLDevice(cl_device_id device);

        void printInfo();

        void printDeviceType(cl_device_type deviceType);
    };
}

#endif

#ifndef _MY_OPENCL_
#define _MY_OPENCL_
#if defined(__APPLE__) || defined(MACOSX)
#include <OpenCL/opencl.h> // This works only for XCODE compiler
#else
#include <CL/cl.h>
#endif
#include <cassert>
#include <iostream>
#include <vector>
#include "Exception.h"
#include "OpenCLDevice.h"
#include "OpenCLPlatform.h"

namespace my {

    class OpenCLDevice;
    class OpenCLPlatform;
    class OpenCL;


    class OpenCL
    {
        cl_uint mnumPlatforms;
        std::vector<OpenCLPlatform> mplatforms;

        void getPlatforms();
    public:

        OpenCL();
        ~OpenCL();

        void quickSetup();

        void printPlatformVersions();
    };
}

#endif

順序付けは「クラスOpenCLDevice;クラスOpenCLPlatform;クラスOpenCL;」ですか。案件?ヘッダーファイルが相互に依存している場合があり、「追跡が難しい」または複雑なインクルージョンにつながる可能性があります...常に使用する複雑なインクルージョンを処理するための「一方向」の手法はありますか?

編集:

実際の問題に一致するようにコードを変更しました。上記のコードを見ると、コンパイラは「OpenCLDeviceはこのスコープで宣言されていません」と言っています。

編集:

私はついにコードを動作させました、そしてこれは私がしたことです:1。OpenCLPlatform.hに#include"OpenCLDevice.h"を追加します2.コンパイルします3.OpenCLPlatform.hに#include"OpenCLDevice.h"を削除します4.コンパイルします今動作します!

編集:

プロジェクトをクリーンアップしてすべての依存関係を削除しましたが、同じエラーが再び発生します。

編集:

コンパイラがコードに何かをしたと思います。ヘッダーとソースファイルでは使用されていないが、他のヘッダーとソースコードでは使用されているライブラリを含めないことを選択した可能性があります

4

2 に答える 2

2

両方のクラスが(おそらく)定義されているclassa.hとclassb.hを含めているので、前方宣言すら必要ありません。

ただし、それらを含めなかった場合は、いいえ、宣言の順序は重要ではありません。クラスが使用される前に前方宣言されている限り、問題はありません。

于 2012-04-19T18:44:30.450 に答える
0

2つの潜在的な問題があります。

あなたはあなた#include "OpenCL.h"が期待するファイル(あなたのもの)を含まないかもしれませんが、代わりにいくつかのシステムファイルを含みます。

あなたの場合、前方宣言は使用できません。クラスインスタンスへのポインタまたは参照がある場合にのみ機能します。クラスvector<OpenCLPlatform>宣言が必要です(つまり、対応するヘッダーを含める必要があります)。

于 2012-04-20T17:43:35.090 に答える