使用模板作为模板函数参数

时间:2015-01-14 18:34:34

标签: c++

各位大家好!

我开始在C ++中学习模板,很抱歉,如果问题太简单= P

我试图写一个这样的函数:

template< template<typename> class C, typename T>
void bRedChannel(C<T> src, C<T> out)
{
    // do something
}

我试图以这种方式调用函数:

Mat_<uchar> roi = image(Rect(10, 10, rows, cols));
Mat_<uchar> masked;
bRedChannel< Mat_<uchar>, uchar >(roi, masked);

导致错误

no matching function for call to ‘bRedChannel(cv::Mat_<unsigned char>&, cv::Mat_<unsigned char>&)´

出了什么问题?

更新

这里是现在的代码:

#include <cv.hpp>
#include <highgui/highgui.hpp>
#include <iostream>

using namespace cv;
using std::cout;
using std::endl;

template< template<typename> class C, typename T>
void bRedChannel(C<T> src, C<T> out)
{

    for (int i = 0; i < src.rows; i += 2)
    {
        for (int j = 0; j < src.cols; j += 2)
        {
            out(i, j) = src(i, j);
        }
    }
};

int main( int argc, char** argv )
{
  int rows = 512, cols = 512;

  Mat_<uchar> image = imread("Autumn-Desktop.jpg", CV_LOAD_IMAGE_GRAYSCALE);
  Mat_<uchar> roi = image(Rect(10, 10, rows, cols));
  image.release();

  Mat_<uchar> masked;
  bRedChannel(roi, masked);

  namedWindow( "Result" );
  imshow( "Result", masked );

  waitKey(0);

  imwrite("teste.png", masked);

  return 0;
}

它现在运行,但它被打断了。问题可能在于现在的算法,但我的问题得到了回答!谢谢@RSahu!

1 个答案:

答案 0 :(得分:4)

而不是

bRedChannel< Mat_<uchar>, uchar >(roi, masked);
            // ^^^^^^^^^ 

使用

bRedChannel< Mat_, uchar >(roi, masked);

通常,在调用函数模板时,不要显式使用类型名。编译器应该能够推断出类型名称。仅当编译器无法推断出类型名称或者您希望使用与编译器推导出的类型不同的类型名称时,才使用显式类型名称。

使用

bRedChannel(roi, masked);

仅在必要时明确使用类型名称。

其他反馈

你有:

template< template<typename> class C, typename T>
void bRedChannel(C<T> src, C<T> out)
{

    for (int i = 0; i < src.rows; i += 2)
    {
        for (int j = 0; j < src.cols; j += 2)
        {
            out(i, j) = src(i, j);
        }
    }
};

你正在使用它:

  Mat_<uchar> masked;
  bRedChannel(roi, masked);

您正在masked修改bRedChannel的本地副本。这些修改对masked中的main没有影响。 bRedChannel的第一个参数也会生成输入参数的副本。通过将类型更改为C<T> const&可以提高效率。

我建议将bRedChannel更改为:

template< template<typename> class C, typename T>
void bRedChannel(C<T> const& src, C<T>& out)
{

    for (int i = 0; i < src.rows; i += 2)
    {
        for (int j = 0; j < src.cols; j += 2)
        {
            out(i, j) = src(i, j);
        }
    }
};