繁体   English   中英

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

[英]Using templates as template function argument

大家好!

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

我正在尝试编写这样的函数:

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

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

#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;
}

导致错误

 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!

代替

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);

您正在修改bRedChannelmasked的本地副本。 这些修改对main masked没有影响。 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);
        }
    }
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM