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&lt;std::string&gt;::getInstance()。如果您希望实例成为您创建的名为Foo 的类,您可以输入FastRetinexFilter&lt;Foo&gt;::getInstance()。这就是 Rakete1111 所指的“指定类型”

以上是关于C++调用类模板的函数模板的主要内容,如果未能解决你的问题,请参考以下文章

模板化成员函数不能从同一个类调用非模板化成员函数,C++

C++提高编程

C++使用模板类调用非静态成员函数

C++提高编程模板 or 泛型

c++模板--让偷懒成为常态

c++模板--让偷懒成为常态