Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;模板函数多重实例化_C++_Templates - Fatal编程技术网

C++ c++;模板函数多重实例化

C++ c++;模板函数多重实例化,c++,templates,C++,Templates,我正在尝试编写代码,将opencv图像转换为QImage。我想使用模板将其实现为一个通用函数。这就是我所拥有的: #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

我正在尝试编写代码,将
opencv
图像转换为
QImage
。我想使用模板将其实现为一个通用函数。这就是我所拥有的:

#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;
}
#包括
#包括
void setPixel(int j、int i、无符号字符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]);
}
模板
QImage至QIMAGEARGB(常数cv::Mat和图像)
{
QImage res(image.cols,image.rows,QImage::Format_ARGB32_预乘);
图像类型tmp;
对于(int i=0;i
我得到以下编译时错误

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
cmakfiles/annotate.dir/main.cpp.o:在函数'std::remove_reference::type&&std::move(cv::ximgproc::superpix种子*&')中:
…/util.h:8:setPixel(int,int,unsigned char,QImage&)的多重定义
cmakfiles/annotate.dir/moc_widget.cxx.o:…/build/./util.h:8:首先在这里定义
cmakfiles/annotate.dir/main.cpp.o:在函数'cv::Vec const&cv::Mat::at(int,int)const'中:
…/util.h:13:setPixel(int,int,cv::Vec,QImage&)的多重定义
cmakfiles/annotate.dir/moc_widget.cxx.o:…/build/./util.h:13:首先在这里定义
collect2:错误:ld返回了1个退出状态
生成[2]:***[…]错误1
生成[1]:***[CMakeFiles/annotate.dir/all]错误2
make:**[全部]错误2
从我的主要方法


使用函数模板可以做到这一点吗?这有意义吗?

这些函数定义(特别是
setPixel()
的两个非模板重载)似乎来自包含在多个翻译单元(即
.cpp
文件)中的头文件,因此违反了一个定义规则

如果希望这些函数的定义显示在头文件中,请将它们声明为
内联

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

我正在将
util.h
头文件包装到我的
CMakeLists.txt
中。它还有
#ifndef
防护装置。我添加了完整的编译错误。@j.dog:首先,这些错误不是来自编译器,而是来自链接器。其次,头保护不保护您免受来自不同.cpp文件的函数定义的多个包含。有关更多信息,请参阅中的第二个问题/答案。要解决此问题,只需将这些函数声明为
inline
,或将其定义移动到.cpp文件中(同时将声明仅保留在标题中)。