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

06.07.2010, 15:39

templates und shift-Operator

Hi hab folgendes problem.

foo.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
27
28
29
30
31
32
template<class T>
static std::ostream& operator<< (std::ostream& out,std::vector<T>& vec){
out << vec.size();
for(size_t i = 0;i < vec.size();i++)
    out << vec[i];
return out;
}
template<class T>
std::istream& operator>> (std::istream& in,std::vector<T>& vec){
size_t size = 0;
in >> size;
vec.resize(size);
for(size_t i = 0;i < vec.size();i++){
    in >> vec[i];
}
return in;
}

namespace Bla{

class Obj{
   private:
   int x,y,z;

    public;
   Obj();

   friend std::ostream operator<< (ostream& out,Obj& outobj);
   friend std::istream operator>> (istream& in,Obj& inobj);
};

}


Dann versucht ich die Funktion auf zu rufen
foo.cpp

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
#include <foo.h>

namespace Bla{

std::ostream operator<< (ostream& out,Obj& outobj){
   //...
}
    std::istream operator>> (istream& in,Obj& inobj){
  //...
}

}


//[...] in irget einer funktion
std::ostream out;
std::vector<std::string> strings;
std::vector<Obj> objs;
//vector füllen
out << strings;
out << objs;
//[...]

und fehler...
error: no match for 'operator<<' in 'out << strings'
error: no match for 'operator<<' in 'out << objs'

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »kiba« (06.07.2010, 16:38)


the[V]oid

Alter Hase

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

2

06.07.2010, 16:00

Kann es selber hier grade nicht ausprobieren, aber funkt es auch nicht, wenn du den zweiten Parameter als const deklarierst?

C-/C++-Quelltext

1
2
3
4
5
6
static std::ostream& operator<< (std::ostream& out, const std::vector<T>& vec){
    out << vec.size();
    for(size_t i = 0;i < vec.size();i++)
        out << vec[i];
    return out;
}


Und kommt die Fehlermeldung nicht, wenn du den Operator direkt aufrufst?

C-/C++-Quelltext

1
2
operator<<( out, strings );
operator<<( out, objs );
<< an dieser Stelle ist eine Signatur verstorben >>

kiba

Alter Hase

  • »kiba« ist der Autor dieses Themas

Beiträge: 327

Wohnort: NRW

Beruf: Azubi: Fach-Info. Anw.

  • Private Nachricht senden

3

06.07.2010, 16:11

Hat auch nicht funktiniert:
no matching function for call to `operator<<(std::basic_ostream<char, std::char_traits<char> >&, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&)'

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

06.07.2010, 16:27

#include <string> vergessen?

kiba

Alter Hase

  • »kiba« ist der Autor dieses Themas

Beiträge: 327

Wohnort: NRW

Beruf: Azubi: Fach-Info. Anw.

  • Private Nachricht senden

5

06.07.2010, 16:30

nein...
es liegt irget wie am std::vector
keine funktion funktioniert egal mit welchen type

die <<,>> operatoren von den anderen klassen findet er

C-/C++-Quelltext

1
2
friend std::ostream operator<< (ostream& out,Obj& outobj);
friend std::istream operator>> (istream& in,Obj& inobj);


vll noch was
die klassen sind alle in einer namespace
und die <<-operator funktionen für den vector sind im der globalen namespace

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »kiba« (06.07.2010, 16:35)


David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

06.07.2010, 17:12

Bei mir klappts für std::vector<std::string> mit dem Code.
@D13_Dreinig

kiba

Alter Hase

  • »kiba« ist der Autor dieses Themas

Beiträge: 327

Wohnort: NRW

Beruf: Azubi: Fach-Info. Anw.

  • Private Nachricht senden

7

06.07.2010, 17:53

Hab die Funktionen mal in die namespace gepackt.
Und er comp. es
Warum es so ist is mir nicht klar.... o.0
Aber wenn das jetzt in der namepsace drin ist, sind die funktionen doch nicht mehr global oder nicht.

Hab noch auserhalb der namespace noch so Sachen stehen wie:

C-/C++-Quelltext

1
2
3
4
5
6
template class DLL std::allocator<int>;
template class DLL std::allocator< std::basic_string<char, std::char_traits<char>, std::allocator<char> > >;
template class DLL std::vector< std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char> > >;

template class DLL std::allocator< Bla::Obj >;
template class DLL std::vector< Bla::Obj, std::allocator<Bla::Obj> >;


Damit der das auch richtig in die DLL einbindet.
Hab es mal auskommentiert und die Funktionen wieder auserhalb der namespace getan , und es kamm wieder der selbe Fehler.

Noch kurze frage:
Beim linken kommt der fehler :
multiple definition of [...]
first defined here

Wenn ich dann die funktionen auf static setze
Krieg ich die Warnung, das die Funktion nicht benutzt wurde in einigen *.cpp (wie krieg ich das weg)

Werbeanzeige