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

15.10.2011, 20:43

multi template

Hi Leute hab ein Problem mit den mingw Compiler (mit den g++ Comp. mit Linux, funk es)
Hab eine .h und eine cpp datei mit 2 template und in einer namespace.
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
27
28
29
30
31
32
33
namespace FileBinary{

template<class T>
std::ostream& writeBinary(std::ostream& stream,const T& value){ ///< Fehler
    stream.write(reinterpret_cast<const char*>(&value),sizeof(value));
    return stream;
}

template<class T>
std::istream& readBinary(std::istream& stream,T& value){ ///< Fehler
    stream.read(reinterpret_cast<char*>(&value),sizeof(value));
    return stream;
}

template<class T>
std::ostream& writeBinary(std::ostream& stream,const std::vector<T>& vec){
    size_t size = vec.size();
    stream.write(reinterpret_cast<const char*>(&size),sizeof(size));
    for(size_t i = 0;i < vec.size();i++)
        writeBinary(stream,vec.at(i));
    return stream;
}
template<class T>
std::istream& readBinary(std::istream& stream,std::vector<T>& vec){
    size_t size = vec.size();
    stream.read(reinterpret_cast<char*>(&size),sizeof(size));
    vec.resize(size);
    for(size_t i = 0;i < vec.size();i++)
        readBinary(stream,vec.at(i));
    return stream;
}

}


basic.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
23
24
25
namespace FileBinary{

template<>
std::ostream& writeBinary(std::ostream& stream,const std::string& str){ ///< Fehler
    size_t strlength = str.length();
    stream.write(reinterpret_cast<const char*>(&strlength),sizeof(strlength));
    stream.write(str.c_str(),strlength);
    return stream;
}

template<>
std::istream& readBinary(std::istream& stream,std::string& str){ ///< Fehler
    size_t strlength = 0;
    stream.read(reinterpret_cast<char*>(&strlength),sizeof(strlength));

    char* buffer = new char[strlength+1]();

    stream.read(buffer,strlength);
    str = buffer;

    delete[] buffer;
    return stream;
}

}


Fehlermeldung:
basic.cpp|111|multiple definition of `std::ostream& FileBinary::writeBinary<std::string>(std::ostream&, std::string const&)'
basic.h|150|first defined here
basic.cpp|119|multiple definition of `std::istream& FileBinary::readBinary<std::string>(std::istream&, std::string&)'
\basic.h|156|first defined here

Hab schon einges versucht.
Hab die template als extern definiert.
Die template von der .cpp in die .h datei.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

15.10.2011, 20:45

Wundert mich sehr, dass g++ das kompiliert. So wärs richtig:

C-/C++-Quelltext

1
2
3
4
5
template<>
std::ostream& writeBinary<std::string>(std::ostream& stream, const std::string& str)
{
  ...
}


EDIT: Ok, nach den Fehlermeldungen würd ich mal vermuten, dass dus eh Syntaktisch richtig gemacht hat. Das Problem ist offenbar, dass die Funktionen mehr als einmal definiert sind. Hast du die .cpp Datei in den Header inkludiert oder sowas?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (15.10.2011, 20:54)


kiba

Alter Hase

  • »kiba« ist der Autor dieses Themas

Beiträge: 327

Wohnort: NRW

Beruf: Azubi: Fach-Info. Anw.

  • Private Nachricht senden

3

15.10.2011, 20:54

funkt leider nicht, immer noch der selbe fehler.
bei einige template hab ich auch die <...> hinter den funktionnamen aus gelassen und da gab es keine fehler.

ja hab in die .cpp die .h datei includiert

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

15.10.2011, 21:07

bei einige template hab ich auch die <...> hinter den funktionnamen aus gelassen und da gab es keine fehler.

Das ist aber kein template, sondern eine Spezialisierung ;)

ja hab in die .cpp die .h datei includiert

Na dann ist doch klar dass genau der Fehler kommt!?

kiba

Alter Hase

  • »kiba« ist der Autor dieses Themas

Beiträge: 327

Wohnort: NRW

Beruf: Azubi: Fach-Info. Anw.

  • Private Nachricht senden

5

15.10.2011, 21:17

vll hast mich falsch verstanden.
habs schon richtig gemach den bei den anderen Spezialisierungen funkt es.

die .h datei ist richtig in der .cpp datei includiert und nicht umgekert

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

15.10.2011, 21:52

Ah ok sry, habs in der Tat falsch verstanden. Das ist dann natürlich komisch. Irgendwie schaffst du es jedenfalls, dass das template zweimal instanziert wird. Du sagst, du hast die templates als "extern definiert"!? Was genau meinst du damit?
Die <...> hinter dem Funktionsnamen brauchst du bei einer Spezialisierung auf jeden Fall. Zumindest in Standard C++. Wenn der Compiler das ohne schluckt, dann muss es sich um einen Compilerbug oder eine compilerspezifische Spracherweiterung handeln.

7

15.10.2011, 22:20

hmm. Seit wann kann man Spezialisierungen in einer Definitionsfile (*.cpp) schreiben. Ich hab gedacht, dass alles was mit Templates zu tun hat in die Headerdatei kommt.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

15.10.2011, 22:22

Naja, die Spezialisierung gibts dann eben nur in dem .cpp File.

9

15.10.2011, 22:24

Naja, ja. So gesehen hast du schon recht. Aber ich bin mir net sicher, ob dass die Intention vom TS ist.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

15.10.2011, 22:32

Ja, über seine Intention hat er leider nicht viel verraten und ohne mehr Code zu sehen kann man schwer mehr tun als einfach nur seine Fragen zu beantworten...

Werbeanzeige