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

1

23.10.2015, 11:21

Untervererbung von Template in GCC

Hallo Liebe Gemeinde,

ich versuche in einem Template mit einer Templatevererbung zu programmieren.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
template<class T>
class oldTemp
{
....
};

template<class T>
class newTemp : public oldTemp<int>
{

}


allerdings compiliert GCC den Code nicht.
Ich habe schon mehrmals im Internetz recherchiert, allerdings ohne Erfolg.


Gruß Bilderberger

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BilderbergerK« (23.10.2015, 12:15)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

23.10.2015, 11:30

Doch, das geht (siehe: http://ideone.com/g0AhFh). Aber ich glaube nicht, dass Du wirklich das willst, was da steht.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

23.10.2015, 11:38

[...]
allerdings compiliert GCC den Code nicht.

Und was sagt GCC wenn er den Code nicht kompiliert? Am Ende von newTemp fehlt ein ;

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (23.10.2015, 11:57)


4

23.10.2015, 13:32

Doch, das geht (siehe: http://ideone.com/g0AhFh). Aber ich glaube nicht, dass Du wirklich das willst, was da steht.
Super,
jetzt funktioniert es. Ich muss wohl irgend ein kleinen Fehler gemacht haben.

Es gibt aber noch ein anderes Problem:
Ist es möglich in einem Template einen Varabelnamen via Parameter bestimmen?

Also statt:

C-/C++-Quelltext

1
2
3
4
5
template <template T>
class C
{
T a;
};




C-/C++-Quelltext

1
2
3
4
5
template <template T(a)>
class C
{
T a;
};

mit dem Ergebnis:

C-/C++-Quelltext

1
2
3
C c<int(super)>

c.super++;


Ich will keinen Präprozessor verwenden.



Danke Dir/Euch!

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

23.10.2015, 13:37

Nein, ich wüsste auch nicht wofür das gut sein soll.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

6

23.10.2015, 13:39

Soweit ich wüsste geht das nicht ohne irgendwelche abgefahrenen C++ Tricks anzuwenden. Halte ich aber auch für nicht sinnvoll so etwas zu machen. Warum genau möchtest du das denn machen?
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

7

23.10.2015, 14:14

Das geht gar nicht.

Es ist allerdings möglich, die Template-Klasse von einer abzuleiten, die diese Variablen definiert. Damit kann man im Prinzip den selben Effekt erreichen.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
template<typename BaseT>
class Templated : public BaseT
{};


//Verwendung...
class CustomVariables
{
public:
    int32_t a;
    double b;
};

Templated<CustomVariables> Obj;

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

23.10.2015, 14:21

int32_t ist übrigens Unsinn. Den kann man gern verwenden, wenn man wirklich wirklich wirklich genau diese Größe braucht, das ist aber höchstens bei binärer Serialisierung oder GPU-Buffern oder sowas der Fall. Für den normalen Anwendungsfall, sollte man int nehmen. Fertig.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

9

23.10.2015, 15:13

lated Obj

Das geht gar nicht.

Es ist allerdings möglich, die Template-Klasse von einer abzuleiten, die diese Variablen definiert. Damit kann man im Prinzip den selben Effekt erreichen.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
template
class Templated : public BaseT
{};


//Verwendung...
class CustomVariables
{
public:
    int32_t a;
    double b;
};

Templated Obj;


Hallo Spiele-Programmierer,

dein Lösungsansatz ist nicht schlecht, allerdings nicht flexibel genug.
Wofür man so etwas braucht? - Wenn man mehrmals von einer Klasse vererbt, die einen statischen Attribut hat.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Basis
{
static int BaseID=0;
};

class A : private Basis
{
...
};


class B : private Basis
{...};

class SuperKlasse : public A, public B  //A und B brauchen jeweils den statischen Member BaseID
{
....
};





Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

10

23.10.2015, 15:30

@BilderbergerK
Warum denkst du, dass der Ansatz nicht flexibel genug ist? Was genau möchtest du den erreichen und was funktioniert mit diesem Ansatz nicht? Prinzipiell sollte der Ansatz mindestens das erlauben, wonach dem du gefragt hattest. Deinen Code verstehe ich übrigens nicht. Von privater Ableitung würde ich auch abraten.

@BlueCobold
Die Anmerkung ist ja mal total am Thema vorbei. Mir scheint, du diskutierst gerne.
Und nein, das ist nicht unsinnig. Es gibt es im Wesentlichen zwei verschiedene Arten von Größen: Zahlen zur Dimensionierung von Speicher und Zahlen die eine andere freie Semantik und Wertebereich besitzen und unabhänig von Speicher sind (Eine Zeit in Sekunden wäre ein Beispiel). int in der Sprache von C(++) besitzt leider weder die eine noch die andere Semantik und ist somit prinzipiell weder für das eine noch für das andere geeignet. int ist ein Phänomen der Vergangenheit, als es noch viele Architekturen gab, die nicht auf Bytes basierten. Deshalb wurden damals im Standard die eingebauten Typen nicht auf feste Größe festgelegt. Heute allerdings ist es in plattformunabhänigen Code höchstens störend, das normale Integertypen ihren Wertebereich zwischen Architekturen und Compilern ändern können und das auch tun. Das Paradebeispiel ist wohl der Unterschied bei long zwischen Linux und Windows. Die Menge an sinnlosen Ärger den das schon bedeutet hat, ist gigantisch und eigentlich nicht zu rechtfertigen. Besonders die Tendenz vieler Linux-Programmierer zur Annahme, dass ihre C(++) Typen überall gleich wären und doch sicher überall das LP64 Model gelten würde, führt bei Portierungen häufig zu Problemen im Wertebereich. "Einfache" Probleme mit eigentlich überflüssigen Casts treten noch häufiger auf, wenn die eingebauten Typen verwendet werden.

Viele moderne verwandte Sprachen für moderne Plattformen verhindern das Problem heutzutage auch korrekt. Dazu gehören zum Beispiel C#, Java, Rust oder D. All die Sprachen machen es richtig. Das macht deutlich, dass die Vorteile von Integer Typen fester Größe für die meisten Fälle überwiegen und heutzutage die richtige Wahl sind.

Wenn man sich auf eine Menge von Plattformen und Compiler beschränkt, kann man mit genauen Festlegungen theoretisch auch mit den eingebauten Typen auskommen. Das ist meiner Meinung etwas engsichtig. Der einzige Grund gegen die Verwendung von Typen fester Größe ist doch, um mit alten Code konsistent zu bleiben und Tippfaulheit. Das kann ich auch verstehen, allerdings nicht warum man ihre Verwendung so schlecht finden könnte.

Werbeanzeige