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更好的错误描述