Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

  • »Spiele Programmierer« ist der Autor dieses Themas

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

1

31.10.2012, 18:19

Fehler bei Hashtable beim Kompilieren von Blocks 5 mit MinGW

Ich versuche gerade verzweifelt, Davids Blocks 5 mit dem MinGW zu kompilieren und anschliessend auf einem älteren Computer lauffähig zu kriegen.
Leider kommen nach dem Start des Buildvorgangs tausende Fehler.
Sehr Viele konnte ich fixen, aber gerade bin ich auf etwas besonders Mystisches gestoßen, bei dem ich nicht so recht weiß, was falsch läuft.
Der Fehler:

Quellcode

1
2
3
4
5
6
7
8
d:\programme\mingw\bin\..\lib\gcc\mingw32\4.6.2\include\c++\backward\backward_warning.h|33|warning: #warning This file includes at least one deprecated or antiquated header which may be removed without further notice at a future date. Please use a non-deprecated interface with equivalent functionality instead. For a listing of replacement headers and interfaces, consult the file backward_warning.h. To disable this warning use -Wno-deprecated. [-Wcpp]|
d:\programme\mingw\bin\..\lib\gcc\mingw32\4.6.2\include\c++\backward\hashtable.h||In member function '__gnu_cxx::hashtable<_Val, _Key, _HashFcn, _ExtractKey, _EqualKey, _Alloc>::size_type __gnu_cxx::hashtable<_Val, _Key, _HashFcn, _ExtractKey, _EqualKey, _Alloc>::_M_bkt_num_key(const key_type&, std::size_t) const [with _Val = std::pair<const std::basic_string<char>, ParameterBlock::GenericParameterContainer*>, _Key = std::basic_string<char>, _HashFcn = __gnu_cxx::hash<std::basic_string<char> >, _ExtractKey = std::_Select1st<std::pair<const std::basic_string<char>, ParameterBlock::Generi|
d:\programme\mingw\bin\..\lib\gcc\mingw32\4.6.2\include\c++\backward\hashtable.h:584|55|instantiated from '__gnu_cxx::hashtable<_Val, _Key, _HashFcn, _ExtractKey, _EqualKey, _Alloc>::size_type __gnu_cxx::hashtable<_Val, _Key, _HashFcn, _ExtractKey, _EqualKey, _Alloc>::_M_bkt_num_key(const key_type&) const [with _Val = std::pair<const std::basic_string<char>, ParameterBlock::GenericParameterContainer*>, _Key = std::basic_string<char>, _HashFcn = __gnu_cxx::hash<std::basic_string<char> >, _ExtractKey = std::_Select1st<std::pair<const std::basic_string<char>, ParameterBlock::GenericParameterCont|
d:\programme\mingw\bin\..\lib\gcc\mingw32\4.6.2\include\c++\backward\hashtable.h:588|48|instantiated from '__gnu_cxx::hashtable<_Val, _Key, _HashFcn, _ExtractKey, _EqualKey, _Alloc>::size_type __gnu_cxx::hashtable<_Val, _Key, _HashFcn, _ExtractKey, _EqualKey, _Alloc>::_M_bkt_num(const value_type&) const [with _Val = std::pair<const std::basic_string<char>, ParameterBlock::GenericParameterContainer*>, _Key = std::basic_string<char>, _HashFcn = __gnu_cxx::hash<std::basic_string<char> >, _ExtractKey = std::_Select1st<std::pair<const std::basic_string<char>, ParameterBlock::GenericParameterContai|
d:\programme\mingw\bin\..\lib\gcc\mingw32\4.6.2\include\c++\backward\hashtable.h:670|56|instantiated from '__gnu_cxx::_Hashtable_const_iterator<_Val, _Key, _HashFcn, _ExtractKey, _EqualKey, _Alloc>& __gnu_cxx::_Hashtable_const_iterator<_Val, _Key, _HashFcn, _ExtractKey, _EqualKey, _Alloc>::operator++() [with _Val = std::pair<const std::basic_string<char>, ParameterBlock::GenericParameterContainer*>, _Key = std::basic_string<char>, _HashFcn = __gnu_cxx::hash<std::basic_string<char> >, _ExtractKey = std::_Select1st<std::pair<const std::basic_string<char>, ParameterBlock::GenericParameterContain|
D:\Programme\Blocks 5\Source\parameterblock.h:37|130|instantiated from here|
d:\programme\mingw\bin\..\lib\gcc\mingw32\4.6.2\include\c++\backward\hashtable.h|592|error: no match for call to '(const hasher {aka const __gnu_cxx::hash<std::basic_string<char> >}) (const key_type&)'|
||=== Build finished: 1 errors, 1 warnings ===|


Um die Hashmap überhaupt erst verwenden zu können, habe ich am Anfang der Headerdatei("manager.h") mit Hashmaps folgendes vorangestellt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
#ifdef __GNUC__
#include <ext/hash_map>
namespace stdext
{
    using namespace __gnu_cxx;
}
#else
#include <hash_map>
#endif


Bin gerade ein wenig ratlos, woran sich der gute GCC Compiler da stört.

  • »Spiele Programmierer« ist der Autor dieses Themas

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

2

01.11.2012, 15:16

Hat keiner eine Idee?

Ich kann noch etwas Quellcode liefern: (Die Datei "Parameterblock.h" in welcher der Fehler anscheinend das erste Mal gefunden wird.)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/*** Klasse für eine Parameter-Sammlung ***/

class ParameterBlock
{
public:
    ParameterBlock()
    {
    }

    ParameterBlock(const ParameterBlock& rhs)
    {
        // alle Parameter kopieren
        for(stdext::hash_map<std::string, GenericParameterContainer*>::const_iterator i = rhs.values.begin(); i != rhs.values.end(); ++i)
        {
            values[i->first] = i->second->copy();
        }
    }

    ~ParameterBlock()
    {
        clear();
    }

    ParameterBlock& operator = (const ParameterBlock& rhs)
    {
        clear();

        // alle Parameter kopieren
        for(stdext::hash_map<std::string, GenericParameterContainer*>::const_iterator i = rhs.values.begin(); i != rhs.values.end(); ++i)
        {
            values[i->first] = i->second->copy();
        }

        return *this;
    }

    template<typename T> void set(const std::string& key,
                                  const T& value)
    {
        stdext::hash_map<std::string, GenericParameterContainer*>::iterator i = values.find(key);
        if(i == values.end())
        {
            // Eintrag existiert noch nicht.
            values[key] = new ParameterContainer<T>(value);
        }
        else
        {
            // alten Eintrag löschen, dann überschreiben
            delete i->second;
            i->second = new ParameterContainer<T>(value);
        }
    }

    template<typename T> const T& get(const std::string& key) const
    {
        stdext::hash_map<std::string, GenericParameterContainer*>::const_iterator i = values.find(key);
        if(i == values.end())
        {
            // Eintrag existiert nicht!
            throw 0;
        }
        else
        {
            // versuchen, zu casten
            const GenericParameterContainer* p_container = i->second;
            const ParameterContainer<T>* p_spec = dynamic_cast<const ParameterContainer<T>*>(p_container);
            if(!p_spec)
            {
                // Falscher Typ!
                throw "Falscher Parametertyp!";
            }
            else
            {
                return p_spec->getValue();
            }
        }
    }

    bool has(const std::string& key) const
    {
        stdext::hash_map<std::string, GenericParameterContainer*>::const_iterator i = values.find(key);
        return i != values.end();
    }

    void clear()
    {
        // alle Parameter löschen
        for(stdext::hash_map<std::string, GenericParameterContainer*>::const_iterator i = values.begin(); i != values.end(); ++i)
        {
            delete i->second;
        }

        values.clear();
    }

private:
    class GenericParameterContainer
    {
    public:
        GenericParameterContainer()
        {
        }

        virtual ~GenericParameterContainer()
        {
        }

        virtual GenericParameterContainer* copy()
        {
            return 0;
        }
    };

    template<typename T> class ParameterContainer : public GenericParameterContainer
    {
    public:
        ParameterContainer(const T& value) : myValue(value)
        {
        }

        ~ParameterContainer()
        {
        }

        GenericParameterContainer* copy()
        {
            return new ParameterContainer<T>(myValue);
        }

        const T& getValue() const
        {
            return myValue;
        }

    private:
        const T myValue;
    };

    stdext::hash_map<std::string, GenericParameterContainer*> values;
};

Tobiking

1x Rätselkönig

  • Private Nachricht senden

3

01.11.2012, 16:26

hash_map besitzt neben Key und Value auch noch eine Hashfunktion als Templateparameter. Als default wird da halt die __gnu_cxx::hash Funktion verwendet, die anscheinend keine Spezialisierung für std::string besitzt. Auf http://the-lost-beauty.blogspot.de/2008/…ubuntu-804.html steht ein Beispiel wie diese einfach auf die für C-Strings zurückgeführt wird.

  • »Spiele Programmierer« ist der Autor dieses Themas

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

4

01.11.2012, 16:44

Ok, vielen dank!!! :D
Das geht jetzt. :)
Es gibt zwar jetzt dafür wieder viele weitere Fehler, aber die kann ich dann vielleicht wieder selber beheben.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifdef __GNUC__
#include <ext/hash_map>
namespace __gnu_cxx {
    template<>
    struct hash<std::string>
    {
        hash<char*> h;
        size_t operator()(const std::string &s) const
        {
            return h(s.c_str());
        };
    };
}
namespace stdext
{
    using namespace __gnu_cxx;
}
#else
#include <hash_map>
#endif

Werbeanzeige