2012-04-19 4 views
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;" 문제? 때로는 헤더 파일이 서로 의존하여 "따르기 힘듭니다"또는 복잡한 포함 물을 포함 할 수 있습니다 ... 항상 사용하는 복잡한 회귀 식을 다루는 "편도"기술이 있습니까?C++ : 이상한 헤더 오류가 나타납니다.

편집 :

실제 문제와 일치하도록 코드를 변경했습니다. 위의 코드를 보면 컴파일러는 'OpenCLDevice가이 범위에서 선언되지 않았습니다'라고 말합니다.

편집 :

내가 마지막으로 작동하는 코드를 가지고,이 내가 무슨 짓을 : 1. 추가 #INCLUDE "OpenCLDevice.h을"OpenCLPlatform.h 2. 3. 제거의 #include 컴파일 "OpenCLDevice.h"in OpenCLPlatform.h 4. 컴파일 이제 작동합니다!

편집 :

나는 프로젝트를 청소하고 모든 종속성을 제거하고 다시 같은 오류를 받고 있어요.

편집 :

저는 컴파일러가 코드에 뭔가를했다고 생각합니다. 헤더 및 소스 파일에서 사용되지 않지만 다른 헤더 및 소스 코드에서 사용되는 라이브러리를 포함하지 않기로 선택했을 수도 있습니다.

답변

2

두 클래스가 (아마도 아마도 classa.h와 classb.h를 포함하기 때문에)) 정의 된 경우 앞으로 선언 할 필요조차 없습니다.

그러나 포함하지 않았다면 선언 순서는 중요하지 않습니다. 클래스를 사용하기 전에 클래스가 선언 된 한, 당신은 괜찮을 것입니다.

0

나는 두 가지 잠재적 인 문제를 참조하십시오

귀하의 #include "OpenCL.h" 당신이 (당신) 예상 파일, 대신 일부 시스템 파일을 포함하지 않을 수 있습니다.

전달 선언은 귀하의 경우에는 사용할 수 없습니다. 클래스 인스턴스에 대한 포인터 또는 참조가있는 경우에만 작동합니다. vector<OpenCLPlatform>에 클래스 선언이 필요합니다 (즉, 해당 헤더 포함).

관련 문제