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

kiba

Alter Hase

  • »kiba« ist der Autor dieses Themas

Beiträge: 327

Wohnort: NRW

Beruf: Azubi: Fach-Info. Anw.

  • Private Nachricht senden

1

21.09.2011, 17:08

map in stream schreiben/lesen

hi Leute hab ein Problem
Ich versucht eine std::map von einer klasse in eine Datei zu schreiben.

basic.h

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
template<class Key, class T>
std::ostream& operator<<(std::ostream& stream,const std::map<Key,T>& vec){
    stream << vec.size();
    typedef typename std::map<Key,T>  mymap;
    typedef typename mymap::const_iterator const_iterator;
    for(const_iterator it = vec.begin(); it != vec.end(); ++it){
        stream << it->first;
        stream << it->second;
    }
    return stream;
}
template<class Key,class T>
std::istream& operator>>(std::istream& stream,std::map<Key,T>& vec){
    size_t newsize;
    stream >> newsize;

    Key first;
    T second;
    vec.clear();
    for(size_t i = 0;i < newsize;i++){
        stream >> first;
        stream >> second;
        vec[first] = second;
    }
    return stream;
}


Foo.hpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "basic.h"

class Foo{
  public:
  float bar;
  float bar2;
  std::map<int,int> attr;

  Foo();

  friend std::ostream& operator<<(std::ostream &stream, const Foo& obj);
  friend std::istream& operator>>(std::istream &stream, Foo& obj);
};

extern std::ostream &operator<<(std::ostream& stream, const Digimon& obj);
extern std::istream &operator>>(std::istream& stream, Digimon& obj);


Foo.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
std::ostream& operator<<(std::ostream& stream,const Foo& obj){
    stream << obj.bar;
    stream << obj.bar2;
    stream << obj.attr; ///<-- Fehler

    return stream;
}
std::istream& operator>>(std::istream& stream, Foo& obj){
    stream >> obj.bar;
    stream >> obj.bar2;
    stream >> obj.attr; ///<-- Fehler

    return stream;
}


Fehler:
error: no match for ‘operator<<’ in ‘stream << obj->Foo::attr’
error: no match for ‘operator>> in ‘stream >> obj->Foo::attr’

Anscheinend kann er den operator nicht finden, aber warum nicht

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

21.09.2011, 17:24

Funktioniert bei mir ohne Probleme (Visual C++ 2010).

3

21.09.2011, 17:26

Für mich sieht der Code eigentlich auch richtig aus. ?(

MfG
Check

kiba

Alter Hase

  • »kiba« ist der Autor dieses Themas

Beiträge: 327

Wohnort: NRW

Beruf: Azubi: Fach-Info. Anw.

  • Private Nachricht senden

4

21.09.2011, 17:30

Vll liegt es daran das ich als key ein enum Benutze(sind aber auch nur Zahlen 0...n) oder das die Klasse(und die streaming-operatoren) in einer namespace drin ist.
Den die streaming-operatoren für die std::map sind auserhalb(also global) definiert.

Edit:
Hab die streaming-Funktionen von den Klassen mal auserhalb der namespace def.
Jetzt kommt ein neuer Fehler.
instantiated from here
error: no match for ‘operator>>’ in ‘stream >> first’|

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
std::istream& operator>>(std::istream& stream, Foo& obj){
    stream >> obj.bar;
    stream >> obj.bar2;
    stream >> obj.attr; ///<-- Hier

    return stream;
}

template<class Key,class T>
std::istream& operator>>(std::istream& stream,std::map<Key,T>& vec){
    size_t newsize;
    stream >> newsize;

    Key first;
    T second;
    vec.clear();
    for(size_t i = 0;i < newsize;i++){
        stream >> first; ///<-- Fehler
        stream >> second;
        vec[first] = second;
    }
    return stream;
}

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »kiba« (21.09.2011, 17:47)


Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

5

21.09.2011, 17:51

Das kann wirklich ein Problem sein. Mit enums und Streamingoperatoren hatte ich zumindest kürzlich auch Probleme. Definiere dochmal explizit einen Streaming-Operator für dein enum.

jokester

Treue Seele

Beiträge: 125

Wohnort: Mainz

  • Private Nachricht senden

6

21.09.2011, 18:10

C-/C++-Quelltext

1
2
    typedef typename std::map<Key,T>  mymap;
    typedef typename mymap::const_iterator const_iterator;
Auch wenns bei dir scheinbar keine Probleme macht: Das erste typename ist falsch. Der Compiler weiß an der Stelle schon, dass da ein Typ rauskommt. Beim zweiten ists aber richtig gesetzt.
"There is a theory which states that if ever anyone discovers exactly what the Universe is for and why it is here, it will instantly disappear and be replaced by something even more bizarre and inexplicable. There is another theory which states that this has already happened" -- Douglas Adams.

kiba

Alter Hase

  • »kiba« ist der Autor dieses Themas

Beiträge: 327

Wohnort: NRW

Beruf: Azubi: Fach-Info. Anw.

  • Private Nachricht senden

7

21.09.2011, 18:17

Habs jetzt gelöst, thy Leute ^^
Es lag doch an den typedef enum dafür müsste man noch doch ein operator-Definieren.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
namespace Attribute{
    typedef enum tAttribute{
        MaxHP = 0,
        MaxMP = 1,
        atk = 2,
        def = 3,
        agi = 4,
        inte = 5,
        MAXATTRIBUTE = 6
    } tAttribute;
};

std::ostream &operator<<(std::ostream& stream, const Data::Attribute::tAttribute& obj){ stream << static_cast<int>(obj); return stream;}
std::istream &operator>>(std::istream& stream, Data::Attribute::tAttribute& obj){ int tmp = 0; stream >> tmp; obj = static_cast<Data::Attribute::tAttribute>(tmp); return stream;}

Oberon

Treue Seele

Beiträge: 181

Wohnort: Österreich

Beruf: Student

  • Private Nachricht senden

8

21.09.2011, 18:42

Und ohne das überflüssige typedef?

kiba

Alter Hase

  • »kiba« ist der Autor dieses Themas

Beiträge: 327

Wohnort: NRW

Beruf: Azubi: Fach-Info. Anw.

  • Private Nachricht senden

9

21.09.2011, 22:27

Kann ich jetzt nicht sagen hab gerade mit ein anderen Problem zu Kämpfen.

Es geht um namespace und friend operatoren.

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
class A;

std::ostream &operator<<(std::ostream& stream, const A& obj);
std::istream &operator>>(std::istream& stream, A& obj);

class A{
   private:
   int a;
   
   public:
   friend std::ostream& ::operator<<(std::ostream& stream, const A& obj);
   friend std::istream& ::operator>>(std::istream& stream, A& obj);
};

namespace Data{
class B;
}

std::ostream &operator<<(std::ostream& stream, const B& obj);
std::istream &operator>>(std::istream& stream, B& obj);

namespace Data{
class B{
   private:
   A bla;
   
    public:
   friend std::ostream& ::operator<<(std::ostream& stream, const B& obj);
   friend std::istream& ::operator>>(std::istream& stream, B& obj);
};
}


namespace Game{
class C;
 }

std::ostream &operator<<(std::ostream& stream, const C& obj);
std::istream &operator>>(std::istream& stream, C& obj);

 namespace Game{
class C{
   private:
   A bla1;
   B bla2;
   
    public:
   friend std::ostream& ::operator<<(std::ostream& stream, const C& obj);
   friend std::istream& ::operator>>(std::istream& stream, C& obj);
};
}


Fehler:
error: ‘Data::B Game::C::bla2’ is private
error: within this context
error: no match for ‘operator<<’ in ‘stream << obj->Game::C::bla2’


Hab es auch so versucht das die Funktionen innerhalb der namespaces sind.
Das hatte dann nur zur folge das er die function nocht finden konnte.
Fehler:
error: no match for ‘operator<<’ in ‘stream << obj->Game::C::bal2’

Werbeanzeige