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

标签 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(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;
}

我得到以下编译时错误

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

来 self 的主要方法。

是否可以使用函数模板来做到这一点,它有意义吗?

最佳答案

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

如果您希望这些函数的定义出现在头文件中,请将它们声明为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]));
}

关于C++模板函数多重实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28108593/

相关文章:

c++ - nullptr、{} 和 nullopt 之间的区别

python - Mako 模板内联 if 语句

c++ - "template polymorphism"为基类型的模板化参数调用函数时,具有派生类型?

c++ - Openmp 原子和关键

c++ - 模板类中的嵌套结构类型

c++ - 常量字符* a[4];我可以更改 a[] 值吗?

c++ - 如何改进 GetComponent<> 方法

c++ - 使用 -O3 在 GCC 中编译共享库不会导出与 -O0 一样多的符号

c++ - 通过基类指针调用正确的模板函数

python - 如何在 Flask/Jinja 模板中使用与过滤器不同的管道?