[英]c++ template function multiple instantiation
I am trying to write code to convert an opencv
image to a QImage
. 我正在尝试编写代码将opencv
图像转换为QImage
。 I want to implement this as a generic function using templates. 我想使用模板将其实现为通用函数。 This is what I have: 这就是我所拥有的:
#include <QImage>
#include <opencv2/core/core.hpp>
void setPixel(int j, int i, unsigned char v, QImage & img)
{
img.setPixel(j, i, qRgb(v, v, v));
}
void setPixel(int j, int i, cv::Vec3b v, QImage & img)
{
img.setPixel(j, i, qRgb(v[2], v[1], v[0]));
}
template <typename ImageType>
QImage toQImageARGB (const cv::Mat & image)
{
QImage res(image.cols, image.rows, QImage::Format_ARGB32_Premultiplied);
ImageType tmp;
for (int i = 0; i < image.rows; ++i)
{
for (int j = 0; j < image.cols; ++j)
{
tmp = image.at<ImageType>(i,j);
setPixel(j, i, tmp, res);
}
}
return res;
}
I get the following compile time error 我收到以下编译时错误
CMakeFiles/annotate.dir/main.cpp.o: In function `std::remove_reference<cv::ximgproc::SuperpixelSEEDS*&>::type&& std::move<cv::ximgproc::SuperpixelSEEDS*&>(cv::ximgproc::SuperpixelSEEDS*&)':
.../util.h:8: multiple definition of `setPixel(int, int, unsigned char, QImage&)'
CMakeFiles/annotate.dir/moc_widget.cxx.o:.../build/../util.h:8: first defined here
CMakeFiles/annotate.dir/main.cpp.o: In function `cv::Vec<unsigned char, 3> const& cv::Mat::at<cv::Vec<unsigned char, 3> >(int, int) const':
.../util.h:13: multiple definition of `setPixel(int, int, cv::Vec<unsigned char, 3>, QImage&)'
CMakeFiles/annotate.dir/moc_widget.cxx.o:.../build/../util.h:13: first defined here
collect2: error: ld returned 1 exit status
make[2]: *** [...] Error 1
make[1]: *** [CMakeFiles/annotate.dir/all] Error 2
make: *** [all] Error 2
from my main method. 从我的主要方法。
Is it possible to do this with function templates, and does it make sense? 是否可以使用功能模板来做到这一点,并且有意义吗?
It seems those function definitions (in particular, the two non-template overloads of setPixel()
) come from a header file that gets included into more than one translation unit (ie .cpp
file), thus violating the One Definition Rule. 似乎这些函数定义(特别是setPixel()
的两个非模板重载)来自一个头文件,该头文件包含在多个翻译单元(即.cpp
文件)中,因此违反了一个定义规则。
If you want those functions' definitions to appear in the header file, declare them as inline
: 如果希望这些函数的定义出现在头文件中,请将它们声明为inline
:
inline void setPixel(int j, int i, unsigned char v, QImage & img)
{
img.setPixel(j, i, qRgb(v, v, v));
}
inline void setPixel(int j, int i, cv::Vec3b v, QImage & img)
{
img.setPixel(j, i, qRgb(v[2], v[1], v[0]));
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.