referencing class outside namespace
-
hallo zusammen,
ich habe folgende codezeilen:
#include "mixim/modules/power/battery/SimpleBattery.h" namespace A { namespace B { class OmnetBatteryAccess : public ModuleAccess<::SimpleBattery> { OmnetBatteryAccess() : ModuleAccess<::SimpleBattery>("battery") { } virtual ::SimpleBattery* get() { cModule* p = findModuleSomewhereUp("battery", simulation.getContextModule()); return dynamic_cast<::SimpleBattery*> (p); } }; }SimpleBattery liegt im globalen namespace, also hat keine namespace definition. Nun sagt der Compiler:
In file included from common/system/battery/OmnetBattery.cc:9:0: common/system/battery/OmnetBatteryAccess.h:18:57: error: ‘::SimpleBattery’ has not been declared common/system/battery/OmnetBatteryAccess.h:18:57: error: ‘::SimpleBattery’ has not been declared common/system/battery/OmnetBatteryAccess.h:18:55: error: ‘<::’ cannot begin a template-argument list [-fpermissive] common/system/battery/OmnetBatteryAccess.h:18:55: note: ‘<:’ is an alternate spelling for ‘[’. Insert whitespace between ‘<’ and ‘::’ common/system/battery/OmnetBatteryAccess.h:18:55: note: (if you use ‘-fpermissive’ G++ will accept your code) common/system/battery/OmnetBatteryAccess.h:18:71: error: template argument 1 is invalid common/system/battery/OmnetBatteryAccess.h:23:21: error: ‘SimpleBattery’ in namespace ‘::’ does not name a typefür die Zeile: public ModuleAccess<::SimpleBattery>
Ich dachte mit :: sage ich schon, dass SimpleBattery im globalen Namespace zu suchen ist. Wo ist den mein Fehler?
Gruß und Dank
-
common/system/battery/OmnetBatteryAccess.h:18:55: error: ‘<::’ cannot begin a template-argument list [-fpermissive] common/system/battery/OmnetBatteryAccess.h:18:55: note: ‘<:’ is an alternate spelling for ‘[’. Insert whitespace between ‘<’ and ‘::’Allerdings verstehe ich nicht, seit wann <: eine Trigraph-Sequenz ist. Oder ist das etwas Implementierungsspezifisches?
Nein, ist vom Standard garantiert - ist ein sog. alternative token, siehe die Tabelle in §2.6.Daher muss da ein Leerzeichen zwischen.
-
Arcoth schrieb:
Allerdings verstehe ich nicht, seit wann <: eine Trigraph-Sequenz ist.
Seit es Digraph-Sequenzen gibt

-
ne, ich habe keine trigraphe definiert. wie komme ich denn dann an die simple battery ran, wenn das im template ungültig ist. ich habe auch schon ein typedef probiert, mag er aber nicht.

-
so, ändert auch nix:
typedef ::SimpleBattery MiximBattery; class OmnetBatteryAccess : public ModuleAccess< MiximBattery > { ...Endet mit:
In file included from common/system/battery/OmnetBattery.cc:9:0: common/system/battery/OmnetBatteryAccess.h:18:17: error: ‘SimpleBattery’ in namespace ‘::’ does not name a type common/system/battery/OmnetBatteryAccess.h:20:57: error: ‘MiximBattery’ was not declared in this scope common/system/battery/OmnetBatteryAccess.h:20:70: error: template argument 1 is invalid common/system/battery/OmnetBatteryAccess.h:25:21: error: ‘MiximBattery’ does not name a type
-
ach, dumm. der fehler sitzt wie immer vor dem rechner. mein OmnetBatteryAccess wird von Battery aufgerufen mit Guard BATTERY_H, SimpleBattery.h setzt als Guard was? Genau, BATTERY_Y.

Ich danke für die Hilfe und entschuldige mich für die Blödheit.

-
SeppJ schrieb:
Arcoth schrieb:
Allerdings verstehe ich nicht, seit wann <: eine Trigraph-Sequenz ist.
Seit es Digraph-Sequenzen gibt

Ja, die habe ich auch gerade im Standard gefunden. Habe mir fast gedacht, dass das der entsprechende Name ist.

ne, ich habe keine trigraphe definiert. wie komme ich denn dann an die simple battery ran, wenn das im template ungültig ist. ich habe auch schon ein typedef probiert, mag er aber nicht.
Nein. Trigraph- bzw. Digraph-Sequenzen werden vom Standard vorgeschrieben. Laut Standard ist
<:im Code stets äquivalent zu[unabhängig davon wo es auftritt*.- ~Die Ausnahme ist das Stringizing im Präprozessor.~
Endet mit:
[...]Dann wurde SimpleBattery nicht deklariert. Das ist eindeutig. Hast du die richtigen Header eingebunden, bist du vollkommen sicher dass
SimpleBatteryin diesem Header deklariert wird, ...?
-
hey arcoth,
viel über Tri- und Digraphe gelernt, und des Fehlers Lösung hab ich kurz vor dir gepostet. Dumm.
Danke vielmals für die Unterstützung.Gruß
sven