B-Baum: Statisches, konstates, öffentliches Attribut streikt



  • Hallo!
    ich will (versuchen, ) einen STL-kompatiblen B-Baum beliebigen Grades (zu) programmieren. Leider bekomme ich Probleme bei öffentlichen, statischen und konstanten Membervariablen:

    template <unsigned order, typename key_t, typename payload_t, typename compare_t = std::greater_equal<key_t>, typename allocator_t = std::allocator<payload_t> >
    class tree {
    
       // ...
    public:
    	static const node<order, key_t, payload_t, compare_t, allocator_t> *null_ptr; // Steht für "nichts"
    	static const node<order, key_t, payload_t, compare_t, allocator_t> *invalid_ptr; // Steht für "Fehler"
    };
    
    // Definition unter der Klasse, node ist irgendeine Klasse:
    
    // Zack:
    template <unsigned order, typename key_t, typename payload_t, typename compare_t, typename allocator_t>
    const node<order, key_t, payload_t, compare_t, allocator_t>* tree<order, key_t, payload_t, compare_t, allocator_t>::null_ptr = reinterpret_cast<const node*>(0);
    
    template <unsigned order, typename key_t, typename payload_t, typename compare_t, typename allocator_t>
    const node<order, key_t, payload_t, compare_t, allocator_t>* tree<order, key_t, payload_t, compare_t, allocator_t>::invalid_ptr = reinterpret_cast<const node*>(-1);
    

    Die MSVCR9 (Visual Studio 2008) schluckt das anstandslos, der GCC meldet hingegen:

    Line 116: error: ISO C++ forbids declaration of 'type name' with no type
    compilation terminated due to -Wfatal-errors.
    

    Und verweist auf die erste Definition der Membervariable. Hat jemand eine Idee, was ich da tun kann? Diese Fehlermeldung sagt mir leider nicht viel.
    :xmas1:



  • const typename node</* elend lange Argumentliste */>* tree = /* ... */;
    //       ^
    


  • Das habe ich auch schon probiert (VS besteht auf wesentlich weniger "typenames" als GCC)

    Resultat, wenn ich ein typename davor setzte, egal ob bei Definition oder Deklaration:

    error: expected nested-name-specifier
    

    Ach und sorry wegen der langen Liste. Sie wurde immer länger, irgendwie sind die ganzen Infos in ihr aber notwendig.
    :xmas1:



  • reinterpret_cast<const node*>(0);
    

    =>

    reinterpret_cast<const node<order, key_t, payload_t, compare_t, allocator_t>*>(0);
    


  • Genau das war's, danke. 🙂
    Ich hatte die Deklaration aus der Node-Klasse in die Tree-Klasse kopiert, aber die Template-Liste da nicht ergänzt. Erstaunlich, warum der Visual Studio Compiler das zulässt... Kann man den irgendwie etwas strikter aufdrehen? Ich meine, beim GCC waren das fatal errors und der VS gibt nicht mal eine Warnung.
    Danke
    :xmas1:


Anmelden zum Antworten