我正在尝试将我的代码转换为使用模板,以便可以将任何类型传递给它。 我正在从Java学习C ++,所以不确定如何以c ++的方式进行。 我收到未声明的标识符错误。 病态仅显示了代码的一小部分。 我希望函数接受任何类型的输入。 在Java中,我只会使用泛型。 ...
提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供 中文繁体 英文版本 中英对照 版本,有任何建议请联系yoyou2525@163.com。
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);
您正在修改bRedChannel
中masked
的本地副本。 这些修改对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.