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 type
    

    fü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


  • Mod

    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.


  • Mod

    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. 😃


  • Mod

    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 SimpleBattery in 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


Anmelden zum Antworten