Templateproblem



  • Hi,

    wahrscheinlich, hab ich irgendwas übersehen, aber wo ist hier der Fehler:

    template< typename T, const short* NAME >
    class ServerBase
    { /* ... */ };
    
    // ...
    
    class MathServer : public ServerBase< MathInterface, L"MathServer" >
    { /* ... */ };
    

    error C2762: 'Pooge::ServerBase': Unzulässiger Ausdruck als Vorlagenargument für 'NAME'

    Warum geht das nicht?

    EDIT: code -> cpp 🙂

    ChrisM



  • ChrisM schrieb:

    Warum geht das nicht?

    Ein Stringliteral kann kein Argument für ein Non-Type-Parameter sein, da ein solches Argument external linkage haben muss, Stringliterale aber static (internal) linkage besitzen.

    Sowas geht hingegen:

    template <const char*>
    class Foo {};
    
    char f[] = "Hallo";
    
    int main()
    {
    Foo<f> q;
    
    }
    


  • Hi,

    ok, das kann ich dann vergessen, weil wenn ich deine Möglichkeit im Header machen würde, würde es ohne aktiviertes Stringpooling den gleichen String ("MathServer") zig mal in der Executable unterbringen. 😞

    Geht es nicht noch anders?

    ChrisM



  • ChrisM schrieb:

    Geht es nicht noch anders?

    zB ein string2int mapping. Du mappst "hallo" zu zB 1 und "foobar" zu 2,...
    kommt halt darauf an was du willst.



  • Hi,

    schade, dann muss ich den String halt doch als Membervariable in ServerBase einbauen. Schade. 😞

    Das Mapping wäre zu unflexibel.

    ChrisM



  • Hi,

    mir ist noch eine Idee gekommen. Könnte ich mit typeid(*this).name() (oder so) nicht den genauen Typ des Objektes als Name rauskriegen?

    Aber ich hab gehört, dass geht nicht bei jedem Compiler und man kriegt nicht immer die gleiche Ausgabe?

    ChrisM



  • ChrisM schrieb:

    mir ist noch eine Idee gekommen. Könnte ich mit typeid(*this).name() (oder so) nicht den genauen Typ des Objektes als Name rauskriegen?

    Ja.

    Aber ich hab gehört, dass geht nicht bei jedem Compiler und man kriegt nicht immer die gleiche Ausgabe?

    Der Name ist halt nicht definiert.
    Mal ist es
    class ::A
    mal ist es
    _udt__A@32
    oder ähnliches

    Wobei ich denke, dass die meisten Compiler auf halbwegs lesbare Namen achten. Aber wirklich optimal ist es leider nicht 😞


Anmelden zum Antworten