C++调用类模板的函数模板
Posted
技术标签:
【中文标题】C++调用类模板的函数模板【英文标题】:Calling function template of class template in C++ 【发布时间】:2016-10-17 14:23:57 【问题描述】:我在 C++ 方面具有中等水平的知识,如果您发现问题很容易或不符合标准,请在此博客中发布,请原谅。但是,不知何故我无法解决它。 :)
您的帮助将不胜感激。这是我的代码: .hpp 文件中的类模板如下:
template<typename T>
class FastRetinexFilter
public:
static T* getInstance();
T Adjust(cv::Mat source, cv::Mat &destination, bool adjustBrightness=true, bool adjustColors=true, int n=3, bool filterOnlyIllumination=false, bool guidedFilter=false, double adjustmentExponent=1.0/2.0, int kernelSize=25, int finalFilterSize=5, double upperBound=255.0);
......
......
......
private:
.....
.....
static T *s_instance;
;
函数的定义在 .cpp 文件中
#include "FastRetinexFilter.hpp"
using namespace cv;
template <class T> T* FastRetinexFilter<T>::s_instance = 0;
template <class T> T*
FastRetinexFilter<T>:: getInstance()
if (!s_instance)
s_instance = new FastRetinexFilter();
return s_instance;
template <class T> T FastRetinexFilter<T>::Adjust(cv::Mat source, cv::Mat &destination, bool adjustBrightness, bool adjustColors, int n, bool filterOnlyIllumination, bool guidedFilter, double adjustmentExponent, int kernelSize, int finalFilterSize, double upperBound)
if (adjustBrightness==false && adjustColors==false)
source.copyTo(destination);
return;
cv::Mat gray;
cvtColor(source, gray, COLOR_BGR2GRAY);
......
......
......
......
......
现在,我想从另一个类调用调整函数,其中包含了头文件,并且 FastRetinexFilter 类的成员在那里正确可见。
我试着用这种方式来做:
FastRetinexFilter::getInstance()->Adjust(colorImgMat, result, brightnessAdjustment, colorCorrection, n, false, gif, a);
但它给了我错误。它说
“FastRetinexFilter”不是类、命名空间或枚举
请建议我应该如何使用 getInstance() 方法调用此函数模板。
当我不使用模板时,定义是这样的。我在其他课程中确实喜欢这样,效果很好:
FastRetinexFilter* FastRetinexFilter::instance = 0;
FastRetinexFilter* FastRetinexFilter::getInstance()
if (!instance)
instance = new FastRetinexFilter();
return instance;
In the header file the declaration is like this :
public:
static FastRetinexFilter* getInstance();
......
.....
private:
static FastRetinexFilter* instance;
......
......
要从这个类中调用一些函数(例如 connectedComponentLabeling),我会这样做:
FastRetinexFilter::getInstance()->connectedComponentLabeling(binImageCopy,numComponent);
但我不明白,在模板的情况下如何做到这一点。 函数“getInstance()”将返回 FastRetinexFilter 类的对象指针。 所以根据你的回答,我应该这样做:
FastRetinexFilter<FastRetinexFilter*>::getInstance()->Adjust(...);
但这不起作用。 我应该尝试什么?请建议。我需要为此类中的其他功能使用模板。所以,这里需要用到类模板和函数模板。
【问题讨论】:
【参考方案1】:你忘记了模板参数:
FastRetinexFilter<...>::getInstance()->Adjust(...);
^^^^^
Specify the type
【讨论】:
对不起,我没有得到你。我是 C++ 模板的新手。我只想调用调整函数。因此,为此我需要创建该类的一个实例,但在这里我调用 getInstace() 函数来生成实例,并通过该函数尝试调用 Adjust 函数。 这种方法适用于普通类和函数,但不适用于模板。 请建议什么模板参数,我应该在这里提一下?由于 Adjust 函数不返回任何内容 @Spandan 为什么你还需要一个模板?普通的课不行吗?我没有指定类型,因为我不知道你想用模板实现什么。 @Spandan 你想要什么类型的?getInstance()
返回模板类型T
,您必须指定它。如果您希望getInstance()
返回std::string
,您可以输入FastRetinexFilter<std::string>::getInstance()
。如果您希望实例成为您创建的名为Foo
的类,您可以输入FastRetinexFilter<Foo>::getInstance()
。这就是 Rakete1111 所指的“指定类型”以上是关于C++调用类模板的函数模板的主要内容,如果未能解决你的问题,请参考以下文章