C++ 使用模板作为模板函数参数
大家好! 我开始学习C++中的模板,如果问题太简单,那么抱歉 我正在尝试编写这样的函数:C++ 使用模板作为模板函数参数,c++,C++,大家好! 我开始学习C++中的模板,如果问题太简单,那么抱歉 我正在尝试编写这样的函数: template< template<typename> class C, typename T> void bRedChannel(C<T> src, C<T> out) { // do something } template 无效数据通道(C src,C out) { //做点什么 } 我试着这样调用函数: Mat_<uchar>
template< template<typename> class C, typename T>
void bRedChannel(C<T> src, C<T> out)
{
// do something
}
template
无效数据通道(C src,C out)
{
//做点什么
}
我试着这样调用函数:
Mat_<uchar> roi = image(Rect(10, 10, rows, cols));
Mat_<uchar> masked;
bRedChannel< Mat_<uchar>, uchar >(roi, masked);
Mat_uroi=image(Rect(10,10,行,列));
蒙面;
bRedChannel(roi,屏蔽);
这导致了错误
no matching function for call to ‘bRedChannel(cv::Mat_<unsigned char>&, cv::Mat_<unsigned char>&)´
调用'bRedChannel(cv::Mat_&,cv::Mat_&')时没有匹配的函数
怎么了
更新:
以下是目前的代码:
#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;
}
#包括
#包括
#包括
使用名称空间cv;
使用std::cout;
使用std::endl;
模板<模板类别C,类型名T>
无效数据通道(C src,C out)
{
对于(int i=0;i
它现在运行,但被中断。现在问题可能出在算法上,但我的问题得到了回答!谢谢@RSahu 而不是
bRedChannel< Mat_<uchar>, uchar >(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);
}
}
};
而不是
bRedChannel< Mat_<uchar>, uchar >(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);
}
}
};
正确的语法应该是
bRedChannel(roi,masked)代码>但此处不需要使用模板参数。让bRedChannel
推导其参数。或者根本不使用模板。@0x499602D2您的确是对的。。。这种可能性浮现在我的脑海里,我开始好奇起来!正确的语法应该是bRedChannel(roi,masked)代码>但此处不需要使用模板参数。让bRedChannel
推导其参数。或者根本不使用模板。@0x499602D2您的确是对的。。。这种可能性浮现在我的脑海里,我开始好奇起来!没用。。。现在我得到一个错误“未定义对`void bRedChannel(cv::Mat_,cv::Mat_)')的引用”。感谢您的回复@R SahuI也会问这个问题@Praetorian=P@Hanz0,这是一个完全不同的错误。函数是否在.h文件中定义,而.h文件#include
d是否在.cpp文件中定义?是的,它在.h文件中,文件包含在.cpp文件中。cpp@Hanz0,你接受了我的回答。这是不是意味着你的问题解决了?没用。。。现在我得到一个错误“未定义对`void bRedChannel(cv::Mat_,cv::Mat_)')的引用”。感谢您的回复@R SahuI也会问这个问题@Praetorian=P@Hanz0,这是一个完全不同的错误。函数是否在.h文件中定义,而.h文件#include
d是否在.cpp文件中定义?是的,它在.h文件中,文件包含在.cpp文件中。cpp@Hanz0,你接受了我的回答。这是否意味着你的问题已经解决了?
Mat_<uchar> masked;
bRedChannel(roi, masked);
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);
}
}
};