0

1 つの画像表現 ( MyImage)から に変換する関数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: 1 つ以上の複数定義されたシンボルが見つかりました

また、OpenCV マトリックスを使用して MyImage をサブし、同じ問題を抱えています。なぜこれが起こっているのですか、どうすれば解決できますか?

4

3 に答える 3

1

ヘッダーガードを追加する必要があります。さらに、ヘッダーで関数を定義する場合は、関数をインラインにします。

#ifndef MYIMAGE2QIMAGE_H
#define MYIMAGE2QIMAGE_H

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

#endif // MYIMAGE2QIMAGE_H
于 2012-05-01T18:23:04.343 に答える
1

あなたは1つの定義規則に違反しています。複数のコンパイル単位に含まれるヘッダーで非インライン関数または非テンプレート関数を定義することは許可されていません。定義を.cppファイルに移動するか、関数をインラインとしてマークします。

于 2012-05-01T18:23:40.810 に答える
1

ヘッダーで関数を定義する場合は、 inlineこの問題を回避するためにも作成する必要があります。

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