Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS-GCC无法看到似乎清晰可见的函数 这个问题可能是我误解了ObjuleC(++)的局限性,以及它是如何与C++交互的直接结果。也可能是我错过了眼前的某件事 我有一个C++类,它在幕后做一些Objto-C++工作。因此,我有一个模板C++类,它对模板化函数进行调用。然后我专门使用模板函数来创建UIImage_C++_Ios_Templates_Gcc_Objective C++ - Fatal编程技术网

iOS-GCC无法看到似乎清晰可见的函数 这个问题可能是我误解了ObjuleC(++)的局限性,以及它是如何与C++交互的直接结果。也可能是我错过了眼前的某件事 我有一个C++类,它在幕后做一些Objto-C++工作。因此,我有一个模板C++类,它对模板化函数进行调用。然后我专门使用模板函数来创建UIImage

iOS-GCC无法看到似乎清晰可见的函数 这个问题可能是我误解了ObjuleC(++)的局限性,以及它是如何与C++交互的直接结果。也可能是我错过了眼前的某件事 我有一个C++类,它在幕后做一些Objto-C++工作。因此,我有一个模板C++类,它对模板化函数进行调用。然后我专门使用模板函数来创建UIImage,c++,ios,templates,gcc,objective-c++,C++,Ios,Templates,Gcc,Objective C++,然而,当我构建时,我得到以下错误 ../ImageProcessing/ImageProcessing/MacOS/MacOSImage.h:43: error: no matching function for call to 'MacOSImage<R5G5B5A1>::MakeUIImage(std::vector<R5G5B5A1, std::allocator<R5G5B5A1> >&, unsigned int, unsigned int)

然而,当我构建时,我得到以下错误

../ImageProcessing/ImageProcessing/MacOS/MacOSImage.h:43: error: no matching function for call to 'MacOSImage<R5G5B5A1>::MakeUIImage(std::vector<R5G5B5A1, std::allocator<R5G5B5A1> >&, unsigned int, unsigned int)'
../ImageProcessing/ImageProcessing/MacOS/MacOSImage.h:41: note: candidates are: UIImage* MacOSImage<ColourSpace>::MakeUIImage() [with ColourSpace = R5G5B5A1]
。/ImageProcessing/ImageProcessing/MacOS/MacOSImage.h:43:错误:调用“MacOSImage::MakeUIImage(std::vector&,unsigned int,unsigned int)”时没有匹配函数
../ImageProcessing/ImageProcessing/MacOS/MacOSImage.h:41:注意:候选项为:UIImage*MacOSImage::MakeUIImage()[颜色空间=R5G5B5A1]
我的头文件如下所示:

#ifndef ImageProcessing_MacOSImage_h
#define ImageProcessing_MacOSImage_h

#include "Image.h"

#ifdef __OBJC__
    #import <UIKit/UIImage.h>
#else
    typedef void UIImage;
#endif

template< typename ColourSpace > UIImage* MakeUIImage( const std::vector< ColourSpace >& colours, unsigned int width, unsigned int height )
{
    return NULL;
}

template< typename ColourSpace > class MacOSImage : public BaseImage< ColourSpace >
{
protected:

public:
    MacOSImage( unsigned int width, unsigned int height );
    virtual ~MacOSImage()   {};

    UIImage* MakeUIImage();
};

template< typename ColourSpace > inline MacOSImage< ColourSpace >::MacOSImage( unsigned int width, unsigned int height ) :
    BaseImage< ColourSpace >( width, height )
{
}

template< typename ColourSpace > inline UIImage* MacOSImage< ColourSpace >::MakeUIImage()
{
    return MakeUIImage( BaseImage< ColourSpace >::Pixels(), BaseImage< ColourSpace >::GetWidth(), BaseImage< ColourSpace >::GetHeight() );
}

#endif
\ifndef图像处理\u MacOSImage\u h
#定义图像处理
#包括“Image.h”
#ifdef__OBJC__
#进口
#否则
图像类型定义;
#恩迪夫
模板UIImage*MakeUIImage(const std::vector&颜色、无符号整数宽度、无符号整数高度)
{
返回NULL;
}
模板class MacOSImage:public BaseImage
{
受保护的:
公众:
MacOSImage(无符号整数宽度、无符号整数高度);
虚拟~MacOSImage(){};
UIImage*MakeUIImage();
};
模板内联MacOSImage::MacOSImage(无符号整数宽度,无符号整数高度):
基本图像(宽度、高度)
{
}
模板内联UIImage*MacOSImage::MakeUIImage()
{
返回MakeUIImage(BaseImage::Pixels(),BaseImage::GetWidth(),BaseImage::GetHeight());
}
#恩迪夫
我觉得这个错误相当令人困惑。更重要的是,如果你忽略我的专业知识,那么在文件的顶部有一个模板函数,它应该与原型完全匹配。它唯一的缺点是将返回NULL。然而,如果我能够编译它,这仍然会给我一个关于正在发生什么的想法

那么有人知道为什么这个不能编译吗

干杯

编辑:根据要求,这里是图像。h:

#ifndef ImageProcessing_Image_h
#define ImageProcessing_Image_h

#include <vector>

template< typename ColourSpace > class BaseImage
{
protected:
    unsigned int                mWidth;
    unsigned int                mHeight;
    std::vector< ColourSpace >  mPixels;
public:
    BaseImage( unsigned int width, unsigned int height );
    virtual ~BaseImage()        {};

    std::vector< ColourSpace >& Pixels();
    const std::vector< ColourSpace >& Pixels() const;

    unsigned int GetWidth() const               { return mWidth;    }
    unsigned int GetHeight() const              { return mHeight;   }
    unsigned int GetBytesPerPixel() const       { return sizeof( ColourSpace );     }
    unsigned int GetBitsPerPixel() const        { return GetBytesPerPixel() * 8;    }
};

template< typename ColourSpace > inline BaseImage< ColourSpace >::BaseImage( unsigned int width, unsigned int height )  :
    mWidth( width ),
    mHeight( height ),
    mPixels( width * height )
{

}

template< typename ColourSpace > inline std::vector< ColourSpace >& BaseImage< ColourSpace >::Pixels()
{
    return mPixels;
}

template< typename ColourSpace > inline const std::vector< ColourSpace >& BaseImage< ColourSpace >::Pixels() const
{
    return mPixels;
}

#if     defined( _OSX )

#include "MacOS/MacOSImage.h"
#define Image MacOSImage

#elif   defined( _WIN32 )

#include "Win32/Win32Image.h"
typedef Win32Image Image;

#else

#error We need a platform specific implementation of the image class

#endif

#endif
\ifndef图像处理\u图像\u h
#定义图像处理\u图像\u h
#包括
模板类BaseImage
{
受保护的:
无符号整数mWidth;
无符号整数mHeight;
标准:向量<色彩空间>像素;
公众:
BaseImage(无符号整数宽度、无符号整数高度);
虚拟~BaseImage(){};
标准::向量&像素();
const std::vector&Pixels()const;
无符号int GetWidth()常量{return mWidth;}
无符号int GetHeight()常量{return mHeight;}
unsigned int GetBytesPerPixel()常量{return sizeof(colorspace);}
unsigned int GetBitsPerPixel()常量{return GetBytesPerPixel()*8;}
};
模板内联BaseImage::BaseImage(无符号整数宽度,无符号整数高度):
mWidth(宽度),
mHeight(高度),
mPixels(宽度*高度)
{
}
模板内联标准::向量&BaseImage::像素()
{
返回像素;
}
模板内联常量std::vector&BaseImage::Pixels()常量
{
返回像素;
}
#如果已定义(_OSX)
#包括“MacOS/MacOSImage.h”
#定义图像MacOSImage
#elif已定义(_WIN32)
#包括“Win32/Win32 Image.h”
typedef Win32Image图像;
#否则
#错误我们需要一个特定于平台的映像类实现
#恩迪夫
#恩迪夫

这是一个经典的名称查找问题。当编译器发现具有相同名称的函数时,将停止查找名称,而忽略签名。只有这样,它才会检查签名并发现它不匹配

您想调用免费版本,因此您需要说:

return ::MakeUIImage( BaseImage< ColourSpace >::Pixels(), 
BaseImage< ColourSpace >::GetWidth(), BaseImage< ColourSpace >::GetHeight() );
return::MakeUIImage(BaseImage::Pixels(),
BaseImage::GetWidth(),BaseImage::GetHeight();

无关提示:最好将所有内容放入您自己的命名空间中,否则当所有符号都位于全局命名空间中时,您迟早会遇到相关困难

您的“分配器”(第二个参数)出现编译错误虽然在sourcestd::vector的std::allocator中似乎找不到它,但它是默认初始化的,所以您可以忽略该AFAIK!你能粘贴图像的任何相关部分吗?是的,这正是问题所在。非常感谢!!我似乎不记得以前有过这个问题。也许只是VisualStudio产生了比XCode版本的GCC:D更好的错误描述