Seite 1 von 1

[gelöst] namespace in shared library

Verfasst: 11. Mai 2011 19:25
von koeditzm
Hallo alle zusammen,

ich möchte in meinem Qt-Projekt eine selbst gebaute shared library (Sammlung einiger Widgets) verwenden. Beim Kompilieren erhalte ich jedoch folgende Fehlermeldung:
'AddressWidget' is not a member of 'SynERPWidget'

Wie kann ich den Namespace der Bibliothek in meiner Applikation verwenden?

Hier der Code des Widgets in meiner Lib:

Code: Alles auswählen

#include "SynERPWidgets_global.h"

#include <QWidget>

namespace SynERPWidget {
    class AddressWidget;
}

class SYNERPWIDGETSSHARED_EXPORT AddressWidget : public QWidget
{
    Q_OBJECT

public:
    AddressWidget(QWidget *parent = 0);
    ~AddressWidget();
};
Und hier der Code meiner Applikation, die auf das Widget zugreift und den Fehler ausgibt:

Code: Alles auswählen

#include "lib/SynERPWidgets/SynERPWidgets/addresswidget.h"


MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    SynERPWidget::AddressWidget *aw =0;    // <-- Hier wird der Fehler erzeugt.

}

MainWindow::~MainWindow()
{
    delete ui;
}
Der Vollständigkeit halber ist hier noch die global-Datei der Library.

Code: Alles auswählen

#ifndef SYNERPWIDGETS_GLOBAL_H
#define SYNERPWIDGETS_GLOBAL_H

#include <QtCore/qglobal.h>

#if defined(SYNERPWIDGETS_LIBRARY)
#  define SYNERPWIDGETSSHARED_EXPORT Q_DECL_EXPORT
#else
#  define SYNERPWIDGETSSHARED_EXPORT Q_DECL_IMPORT
#endif

#endif // SYNERPWIDGETS_GLOBAL_H
Möglicherweise ist das ja auch ein falsches vorgehen?

Gruß aus Walsrode

Verfasst: 11. Mai 2011 20:01
von koeditzm
Ich habe eine Lösung gefunden. Allerdings verstehe ich die Ursache nicht ganz.

Wenn ich die Klassendefinition in den Namespace setze, klappt es wunderbar.

Code: Alles auswählen

#include "SynERPWidgets_global.h"

#include <QWidget>

namespace SynERPWidget {

class SYNERPWIDGETSSHARED_EXPORT AddressWidget : public QWidget
{
    Q_OBJECT

public:
    AddressWidget(QWidget *parent = 0);
    ~AddressWidget();
};

}
Darf ich keine forward declaration im Namespace durchführen, oder ist die fehlerhaft? Vielleicht kann mir jemand diese Frage beantworten.

Verfasst: 11. Mai 2011 21:01
von franzf
Sicher darfst du Forward-Declarations im namespace vornehmen. Nur hier hilft dir eine fwd-decl. nichts: Du willst ja eben deine Klasse AddressWidget definieren, so dass sie verwendet werden kann.
In der fehlerhaften Variante hattest du
* eine fwd-decl. von SynERPWidget::AddressWidget
* eine Definition von ::AddressWidget (globaler namespace)

Schau dir besser nochmal im Buch an, wie man namespaces korrekt verwendet, und wann man eine forward-declaration verwenden kann/sollte.

Verfasst: 11. Mai 2011 21:38
von koeditzm
Danke dir. Werde mich nochmals eingehender mit Namespaces beschäftigen. Ich weiß ja nun wonach ich suchen muss.