Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 04, 2025 20:33

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: [C++] Vererbung von typedefs
BeitragVerfasst: Mo Jun 21, 2010 13:27 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Ich habe hier gerade ein merkwürdiges Problem bei der Erweiterung einer Template-Klasse. Ich will die bestehende Klasse Polyhedron_3 um eine std::multimap und einige Methoden erweitern. Aus irgendeinem Grund werden aber Typdefinitionen nicht richtig mit vererbt. Ich brauche unter anderem den Typ Facet_handle aus der Oberklasse.

Fragen:
1. Muss ich wirklich sämtliche Typen aus der Oberklasse erneut via typedef angeben? Nicht das Problem, aber eigentlich sollten die Typen doch auch so übernommen werden. Funktioniert das nur bei Nicht-Template-Klassen?

2. Wieso kriege ich die folgende Fehlermeldung:
Code:
./cgal.h:85: error: type ‘std::multimap<unsigned int, typename CGAL::Polyhedron_3<Traits, CGAL::Custom_Polyhedron_items_3, CGAL::HalfedgeDS_default, std::allocator<int> >::Facet_handle, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, typename CGAL::Polyhedron_3<Traits, CGAL::Custom_Polyhedron_items_3, CGAL::HalfedgeDS_default, std::allocator<int> >::Facet_handle> > >’ is not derived from type ‘CGAL::Custom_Polyhedron_3<Traits>’

Ich meine es ist offensichtlich das die multimap nicht von Custom_Polyhedron_3 erbt, aber wieso ist das ein Problem?


Hier der gekürzte Code:
Code:
   /** extend Polyhedron_3 with a multimap that keeps track of face IDs. */
   template <class Traits>
   class Custom_Polyhedron_3 : public Polyhedron_3<Traits, Custom_Polyhedron_items_3> {
      public:
         typedef Polyhedron_3<Traits, Custom_Polyhedron_items_3> Parent;
         typedef typename Parent::Facet_handle Facet_handle;
         typedef typename Parent::Facet_const_handle Facet_const_handle;

         typedef std::multimap<uint32_t, Facet_handle>::iterator Facet_id_iterator;

      /* ... */
   };

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: [C++] Vererbung von typedefs
BeitragVerfasst: Mo Jun 21, 2010 13:35 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Dieses minimale Beispiel klappt:
Code:
#include <iostream>
#include <cstdlib>
#include <map>

template<class T>
class A {
public:
   struct MyType {
      T a, b;
   };
};

template<class T>
class B : public A<T> {
public:
   typedef typename A<T>::MyType MyType;
   typedef std::multimap<int, MyType> Map;

   Map map;
};

int main( void )
{
   B<float> b;
   std::cout << b.map.size() << "\n";
   return 0;
}


Wieso geht das andere nicht?

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: [C++] Vererbung von typedefs
BeitragVerfasst: Mo Jun 21, 2010 13:39 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Ok, erledigt, es muss so heißen:
Code:
typedef typename std::multimap<uint32_t, Facet_handle>::iterator Facet_id_iterator;


Edit:
Frage 1 bliebe aber noch zu beantworten. Muss ich wirklich sämtliche Typedefs aus der Oberklasse wiederholen?

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: [C++] Vererbung von typedefs
BeitragVerfasst: Fr Jun 25, 2010 09:34 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Die Typedefs bleiben erhalten und sind auch in ableitungen erreichbar, bei dir scheint ledeglich das Problem zu sein, dass du durch die templates noch typename mit angeben musst. Sobald du ein Teil eines Templates in einem Template nutzt musst du typename verwenden, damit der compiler erstmal das eine template erzeugt und dann das, wo das Template genutzt werden soll. Sonnst kann der compiler nicht weiter machen, da der Datentyp noch unbekannt wäre und kann entsprechend auch nicht auf elemente des Templates zugreifen.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 14 Queries | GZIP : On ]