Verwende noch SuSE 11.2.
Ich habe eine (umfangreiche) Nicht-Template-Klasse togo, in der Objekte zweier Klassen, much und Town, verwendet werden,
much ist Template-Klasse, die je nach Instantiierung z.B. auf Town oder einfachen Datentypen aufbaut.
togo braucht Konstruktoren, deren Parameter Town und verschiedenen Instantiierungen von much sein können.
Also insgesamt eigentlich noch eine recht simple Konstruktion.
g++ habe ich dazu gebracht, ein Konstruktor-Template zu fressen - das ist das,was ich brauche.
Leider erzeugt dann der Compiler - bis zum Linken ohne Fehlermeldung oder Warnung - nicht alle benötigten Funktionen,
wenn ein Template-Parameter von much selbst wieder Klasse (Town) ist.
Holt man das 'von Hand' nach, wird u.a. Mehrfachdefinition angemosert, auch kein Linken möglich.
Als (grauslichen) Work-around habe ich mir das folgende einfallen lassen, bei dem g++ aber auch streikt,
Fehlermeldung:
go.cc: In constructor ‘togo::togo(const much<Town, Town>&, const Town&)’:
go.cc:532: error: no matching function for call to ‘mocktogo(const much<Town, Town>&, const Town&)’
Ob mit oder ohne '&', mit oder ohne 'const' erscheint völlig egal, aber eventuelle weitere Parameter zu mocktogo
gibt g++ bei der Fehlermeldung mit zusätzlichem '&' an, also statt erwartetem long .. long& (vermutlich unerheblich).
Egal, woran ich drehe - das Ergebnis bleibt in etwa gleich.
Fällt jemandem etwas auf, was ich übersehe?
Weiß jemand, wie Konstruktoren mit Parameter u.a. aus much (template-Klasse) erfolgreich - also so, dass g++ damit klarkommt - zu togo hinzugefügt werden können,
ohne togo zur Templateklasse zu machen?
Also so, dass g++ nicht nur (bei -Wall) ohne Fehler und Warnung übersetzt, sondern das Ganze auch linkbar ist?
typedef much<real_word,word> muchWord;
//typedef much<Town, Town> muchTown; // egal, ob dies ...
#define muchTown much<Town, Town> // .. oder dies verwendet - es geht nicht
//typedef much<real_word,word> muchWord; // aber mit einfachen Typen geht es dem Anschein nach ... nutzt nur nichts ...
class togo {
public:
togo (bool C_is=false);
togo (const char* R_text);
togo (togo const& toCopy);
togo (muchWord const& f, double x);
togo (much<long,long> const& f, long x);
togo (muchTown const& f, Town const& x);
..... // ggf. weitere Konstruktoren, alle wären aus einem Funktionstemplate ableitbar
};
template<class m_real_word, class m_word>
togo mocktogo(much<m_real_word,m_word> const& f, m_word const& x) {
m_word y = x;
unsigned i;
togo erg(reserves);
....
return erg;
};
togo::togo(muchWord const& f, double x) { // wird akzeptiert
*this = mocktogo<real_word,word>(f, x);
};
togo::togo(much<long,long> const& f, long x) { // habe ich nicht explizit aktiviert
*this = mocktogo<long,long>(f, x);
};
togo::togo (muchTown const& f, Town const& x) { /*much<Town,Town>*/
*this = mocktogo<muchTown,Town>(f, x); // or .. <much<Town, Town>, Town>
};
Ich habe eine (umfangreiche) Nicht-Template-Klasse togo, in der Objekte zweier Klassen, much und Town, verwendet werden,
much ist Template-Klasse, die je nach Instantiierung z.B. auf Town oder einfachen Datentypen aufbaut.
togo braucht Konstruktoren, deren Parameter Town und verschiedenen Instantiierungen von much sein können.
Also insgesamt eigentlich noch eine recht simple Konstruktion.
g++ habe ich dazu gebracht, ein Konstruktor-Template zu fressen - das ist das,was ich brauche.
Leider erzeugt dann der Compiler - bis zum Linken ohne Fehlermeldung oder Warnung - nicht alle benötigten Funktionen,
wenn ein Template-Parameter von much selbst wieder Klasse (Town) ist.
Holt man das 'von Hand' nach, wird u.a. Mehrfachdefinition angemosert, auch kein Linken möglich.
Als (grauslichen) Work-around habe ich mir das folgende einfallen lassen, bei dem g++ aber auch streikt,
Fehlermeldung:
go.cc: In constructor ‘togo::togo(const much<Town, Town>&, const Town&)’:
go.cc:532: error: no matching function for call to ‘mocktogo(const much<Town, Town>&, const Town&)’
Ob mit oder ohne '&', mit oder ohne 'const' erscheint völlig egal, aber eventuelle weitere Parameter zu mocktogo
gibt g++ bei der Fehlermeldung mit zusätzlichem '&' an, also statt erwartetem long .. long& (vermutlich unerheblich).
Egal, woran ich drehe - das Ergebnis bleibt in etwa gleich.
Fällt jemandem etwas auf, was ich übersehe?
Weiß jemand, wie Konstruktoren mit Parameter u.a. aus much (template-Klasse) erfolgreich - also so, dass g++ damit klarkommt - zu togo hinzugefügt werden können,
ohne togo zur Templateklasse zu machen?
Also so, dass g++ nicht nur (bei -Wall) ohne Fehler und Warnung übersetzt, sondern das Ganze auch linkbar ist?
typedef much<real_word,word> muchWord;
//typedef much<Town, Town> muchTown; // egal, ob dies ...
#define muchTown much<Town, Town> // .. oder dies verwendet - es geht nicht
//typedef much<real_word,word> muchWord; // aber mit einfachen Typen geht es dem Anschein nach ... nutzt nur nichts ...
class togo {
public:
togo (bool C_is=false);
togo (const char* R_text);
togo (togo const& toCopy);
togo (muchWord const& f, double x);
togo (much<long,long> const& f, long x);
togo (muchTown const& f, Town const& x);
..... // ggf. weitere Konstruktoren, alle wären aus einem Funktionstemplate ableitbar
};
template<class m_real_word, class m_word>
togo mocktogo(much<m_real_word,m_word> const& f, m_word const& x) {
m_word y = x;
unsigned i;
togo erg(reserves);
....
return erg;
};
togo::togo(muchWord const& f, double x) { // wird akzeptiert
*this = mocktogo<real_word,word>(f, x);
};
togo::togo(much<long,long> const& f, long x) { // habe ich nicht explizit aktiviert
*this = mocktogo<long,long>(f, x);
};
togo::togo (muchTown const& f, Town const& x) { /*much<Town,Town>*/
*this = mocktogo<muchTown,Town>(f, x); // or .. <much<Town, Town>, Town>
};