0

我有一个函数可以从一个图像表示 ( MyImage) 转换为 a QImage,我决定将命名空间专用于以这种方式接口的函数会更整洁。我以前直接在代表我的类中使用此函数 main QMainWindow

因此,我创建了一个文件MyFormatToQtInterfacing.h,如下所示:

#include <QtGui/QMainWindow>
#include <qlabel.h>

namespace MyFormatToQtInterfacing
{
    // These functions below convert a cv::Mat to a QImage.
    // Adapted from http://stackoverflow.com/questions/5026965/how-to-convert-an-opencv-cvmat-to-qimage
    // The grayscale ones seem to be inverted.  Look into this later.

    QImage MyImage2QImage(const MyImage &src) { //snip };
};

然后我从这个新的命名空间调用函数,正如你所期望的那样,我得到以下链接器错误:

1>main.obj : 错误 LNK2005: "class QImage _ cdecl MyFormatToQtInterfacing::Mat2QImage(class MyImage2QImage const &)" (?MyImage2QImage@MyFormatToQtInterfacing@@YA?AVQImage@@ABV?$Mat @V?$Vec@E$02@ cv@@@cv@@@Z) 已经在 moc_Tracker.obj 中定义

1>Tracker.obj : 错误 LNK2005: "class QImage _ cdecl MyFormatToQtInterfacing::MyImage2QImage(class MyImage2QImage const &)" (?MyImage2QImage@MyFormatToQtInterfacing@@YA?AVQImage@@ABV?$Mat @V?$Vec@E$02@ cv@@@cv@@@Z) 已经在 moc_Tracker.obj 中定义

1>C:\Projects\Tracker\Tracker.exe : 致命错误 LNK1169: 找到一个或多个多重定义符号

我也一直在用 OpenCV 矩阵替换 MyImage 并遇到同样的问题。为什么会发生这种情况,我该如何解决?

4

3 回答 3

1

如果你在头文件中定义函数,你也必须让它 inline避免这个问题。

 inline QImage MyImage2QImage(const MyImage &src) { /*snip*/ };
于 2012-05-01T18:22:12.503 回答
1

您应该添加一个标头保护,并且如果您在标头中定义该函数,则另外使该函数内联。

#ifndef MYIMAGE2QIMAGE_H
#define MYIMAGE2QIMAGE_H

inline QImage MyImage2QImage(const MyImage &src) { //snip };

#endif // MYIMAGE2QIMAGE_H
于 2012-05-01T18:23:04.343 回答
1

您违反了单一定义规则。不允许在包含在多个编译单元中的头文件中定义非内联或非模板函数。将您的定义移动到 .cpp 文件或将函数标记为内联。

于 2012-05-01T18:23:40.810 回答