#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
是否排序&#34;类OpenCLDevice; class OpenCLPlatform; OpenCL;&#34;物?有时,头文件彼此依赖,这可能导致难以遵循&#34;或者是错综复杂的内容...你有一种方式吗?#34;处理你一直使用的复杂内含物的技术?
编辑:
我更改了代码以匹配我的真实问题。如果你看一下上面的代码,编译器会说&#39; OpenCLDevice没有在这个范围内声明&#39;。
编辑:
我终于让代码工作了,这就是我做的: 1.在OpenCLPlatform.h中添加#include&#34; OpenCLDevice.h&#34; 2.编译 3.在OpenCLPlatform.h中删除#include&#34; OpenCLDevice.h&#34; 4.编译 它现在有效!
编辑:
我清理了项目并删除了所有依赖项,并且我再次遇到相同的错误。
编辑:
我认为编译器对代码做了些什么。它可能已选择不包含未在标头和源文件中使用的库,但在其他标头和源代码中使用
答案 0 :(得分:2)
由于你包括classa.h和classb.h,其中两个类(推测)都是定义的,你甚至不需要前向声明。
但是,如果你没有包含它们,那么不,声明的顺序无关紧要。只要一个类在使用之前被声明,你应该没问题。
答案 1 :(得分:0)
我发现了两个潜在的问题:
您的#include "OpenCL.h"
可能不包含您期望的文件(您的文件),而是包含一些系统文件。
在您的情况下不能使用前向声明。它仅在您具有指针或类实例的引用时才有效。您的vector<OpenCLPlatform>
需要类声明(即包含相应的标题)。