【问题标题】:C++: Strange header error showing upC++:出现奇怪的标头错误
【发布时间】:2012-04-21 01:43:35
【问题描述】:
#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

排序是否为“class OpenCLDevice;class OpenCLPlatform;class OpenCL;”事情?有时,头文件相互依赖,这可能导致“难以理解”或复杂的包含...您是否有一种“单向”技术来处理您一直使用的复杂的包含?

编辑:

我更改了代码以匹配我的实际问题。如果您查看上面的代码,编译器会说“OpenCLDevice 未在此范围内声明”。

编辑:

我终于让代码工作了,这就是我所做的: 1.在OpenCLPlatform.h中添加#include "OpenCLDevice.h" 2.编译 3. 删除 OpenCLPlatform.h 中的#include "OpenCLDevice.h" 4. 编译 现在可以了!

编辑:

我清理了项目并删除了所有依赖项,但我再次遇到相同的错误。

编辑:

我认为编译器对代码做了一些事情。它可能选择不包含头文件和源文件中未使用但在其他头文件和源代码中使用的库

【问题讨论】:

    标签: c++ xcode opencl


    【解决方案1】:

    由于您包含了 classa.h 和 classb.h,其中两个类(可能)都已定义,因此您甚至不需要前向声明。

    但是,如果您不包括它们,那么不,声明的顺序无关紧要。只要一个类在使用之前被前向声明,你应该没问题。

    【讨论】:

      【解决方案2】:

      我发现两个潜在问题:

      您的#include "OpenCL.h" 可能不包含您期望的(您的)文件,而是一些系统文件。

      在您的情况下不能使用前向声明。它仅在您有指向类实例的指针或引用时才有效。您的 vector&lt;OpenCLPlatform&gt; 需要类声明(即包含相应的标头)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-08
        • 2016-04-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多