Templatefunktion mit Methodenaufruf als Argument

25/02/2015 - 10:55 von Alexander Wolf | Report spam
Hallo liebe Leser,

ich hatte kürzlich ein Problem mit einem Kompiler für die
ARM-Architektur laut Doku (ISO/IEC 14822:2003)

Jetzt interessiert es mich ob ich ein Verstànisproblem habe oder der Kompiler
buggy ist. Bei dem unten stehenden Beispiel kommt auf stdout Datenmüll raus.

Auf dem PC mit /g++ (Debian 4.7.2-5) 4.7.2/
g++ -o tempFunc main.cpp -Wall -Wextra funktioniert alles wie erwartet.

Meine Frage sind bei Templatefunktionen Aufrufe
tempFunc(pBar->getValue(), pBar->getId());
nicht standardkonform?

Für Infos schon besten Dank im voraus.

Alex

/* main.cpp

version: g++ (Debian 4.7.2-5) 4.7.2
invocation: g++ -Wall -Wextra -o tempFunc main.cpp

*/

#include<iostream>
#include<inttypes.h>
#include<cstdlib>

class IFoo{

public:
virtual float getValue() const = 0;
virtual uint32_t getId() const = 0;
virtual ~IFoo() { };

protected:
IFoo() { };
};

class Bar : public IFoo { // implements IFoo

public:
Bar(float Value, uint32_t Id) : Value(Value), Id(Id) { }
virtual float getValue () const { return Value; }
virtual uint32_t getId () const { return Id; }
virtual ~Bar() { };

private:
float Value;
const uint32_t Id;
};

template<typename T1, typename T2>
void tempFunc(T1 par1, T2 par2){

std::cout << "Par1: " << par1 << "\tPar2: " << par2 << "";
}


int main(void){

IFoo *pBar = new Bar(1.2345f, 1U);

tempFunc(pBar->getValue(), pBar->getId());

/* Das geht auch mit dem Kompiler fuer die ARM-Architektur
*
* float Value = pBar->getValue();
* uint32_t Id = pBar->getId();
*
* tempFunc(Value, Id);
*/

delete pBar;

return EXIT_SUCCESS;
}
Nur wer seinen eigenen Weg geht, kann von niemanden überholt werden.
(Marlon Brando)
 

Lesen sie die antworten

#1 Daniel Krügler
25/02/2015 - 18:06 | Warnen spam
Am Mittwoch, 25. Februar 2015 12:30:04 UTC+1 schrieb Alexander Wolf:
Hallo liebe Leser,

ich hatte kürzlich ein Problem mit einem Kompiler für die
ARM-Architektur laut Doku (ISO/IEC 14822:2003)

Jetzt interessiert es mich ob ich ein Verstànisproblem habe oder der Kompiler
buggy ist. Bei dem unten stehenden Beispiel kommt auf stdout Datenmüll raus.



Was genau meinst du mit dem Begriff "Datenmüll"? Was ist die konkrete Ausgabe?

Meine Frage sind bei Templatefunktionen Aufrufe
tempFunc(pBar->getValue(), pBar->getId());
nicht standardkonform?



Die Frage als solche macht für mich keinen Sinn (insbesondere nicht in der generellatisierten Frageform). Was ich dazu sagen kann, ist Folgendes: Beim Aufrufpunkt ist pBar ein Zeiger auf ein gültiges Objekt von einem Typ welcher von IFoo abgeleitet ist und dessen Elemente initialisiert sind und somit lesbar sind. Der Typ uint32_t ist über das Inkludieren von Header intypes.h im Code bekannt und ein Ganzzahltyp für den es via Header <iostream>, der laut C++11 den Header <ostream> einbinden muß, eine Überladung von operator<< bereitstellt.

Eine Ursache deines Problems (welches du leider nicht genauer beschrieben hast), könnte sein, dass dein Compiler im C++03-Modus kompiliert und dann nicht gzwungen ist, den Header <ostream> über <iostream> einzubinden und dann stànde die operator<<-Überladung theoretisch nicht zur Verfügung. Löst ein explizites

#include <ostream>

dein Problem?

Besten Gruß aus Bremen,

Daniel Krügler

Ähnliche fragen