大家好!

我开始学习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!

#1楼 票数: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);

您正在修改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);
        }
    }
};

  ask by Hanz0 translate from so

未解决问题?本站智能推荐:

2回复

使用模板作为函数参数

我正在尝试将我的代码转换为使用模板,以便可以将任何类型传递给它。 我正在从Java学习C ++,所以不确定如何以c ++的方式进行。 我收到未声明的标识符错误。 病态仅显示了代码的一小部分。 我希望函数接受任何类型的输入。 在Java中,我只会使用泛型。
4回复

模板函数作为模板参数

我刚刚对如何在 C++ 中以通用方式实现某些东西感到困惑。 这有点复杂,所以让我一步一步解释。 考虑这样的代码: 很容易注意到function1和function2的作用相同,唯一不同的部分是内部函数。 因此,我想让function通用以避免代码冗余。 我可以使用函数指针或模板来做到这一点。 让我暂
1回复

模板函数作为模板参数

我正在学习模板并尝试实现此方法: 它需要一个函数和两个参数,并在翻转两个参数的情况下调用给定的函数。 它的功能很好,例如: 当我尝试这个功能时: 附: 编译器(g ++ 4.7.1)告诉我: 错误:无法将'std :: basic_string'左值绑定到'std ::
2回复

模板函数的模板参数

我刚刚发布了一个skiplist容器库。 Sun编译器抱怨这个: 错误是: 上面的代码是从207开始的。但似乎它正在抱怨reverse_iterator。 我真的无法理解它。 我没有直接访问Sun编译器,所以我想知道我做错了什么。 另外,我只在reverse_iterator中
4回复

模板函数:如何使用模板类作为参数创建模板函数?

是否可以为其参数列表中具有模板类的函数创建模板? 我想为statSelection()和statInsertion()创建一个模板,它允许我测试不同的排序算法,而不必为我正在测试的每种类型的排序算法创建单独的stat函数。 (我的排序算法是模板类)
2回复

使用模板类的参数定义模板函数

有一个模板类 template <class T0, class T1, ....... > // many template parametersclass Foo { ...... } 如何定义模板函数以接受带有任何模板参数的Foo ? 该函数可以是operator <
4回复

如何使用函数获取模板模板参数推导?

考虑一组函数,如 旨在将函数类型作为参数。 然后,这是完全可以的: 现在,我想摆脱重复的int temaplate参数,所以我尝试这样做: 但是这无法在gcc 4.5.1上编译( 'error: no matching function for call to 'Helper<
1回复

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

我正在编写一个具有反复调用的函数的类,并决定将其作为模板参数来实现。 作为我正在谈论的具体示例,请考虑以下课程: 然后可以用一个函数实例化,例如: 但是,我需要该函数可被不同类型调用(该函数中的操作当然适用于所有类型),也就是说,我希望将此函数模板化,如下所示: 我仍然可以将其用作