Toon posts:

[C++/STL] Template probleem onder HPUX aCC

Pagina: 1
Acties:

Verwijderd

Topicstarter
Het probleem:

Ik heb dus een template class List die geinherited is van std::list. Deze afgeleide template class maakt gebruik van de const_iterator gedefineerd in de base class list.

deel van List:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template <class T>
class List : public list<T> {
public:

   List() : list<T>() {}
   List( const Vector<T>& vec )
          { for (int i=0; i<vec.size(); i++) push_back( vec[i] ); }

   List<T>& operator=( const List<T> &rhs ) {
      if (this != &rhs ) {
     erase( this->begin(), this->end() );
     for (typename list<T>::const_iterator i=rhs.begin(); i!=rhs.end(); i++)
        push_back( *i );
      }
      return *this;
   }
...



Onder Linux/GCC werkt dit prima, maar zodra ik de HPUX compiler aCC gebruik (die volstrekt ANSI compatible zou moeten zijn) komt de compiler met de volgende error message:

code:
1
2
3
4
5
Error 619: "Polygon3.h", line 65 # The definition of template List<P3<double> > contains typename
    qualification 'List<T>::const_iterator', yet generation of specialization class List<P3<double> >
    implies that 'List<T>' is 'class List<P3<double> >', which does not contain a type named
    'const_iterator'.
       Polygon3( const List<Point3>& vertices )


Nu vraag ik mij af, doe ik nu iets dat niet volgens de standaard kan en GCC is niet zo strikt, of kan het een bug in de STL of compiler zijn van HPUX.

Verwijderd

Topicstarter
In een andere functie in de class werd het er geschreven:
code:
1
 typename List<T>::const_iterator i


ofwel, met een hoofdletter grokt hij het niet...

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 26-08 16:13

.oisyn

Moderator Devschuur®

Demotivational Speaker

zijn je problemen wel verder helemaal opgelost als je overal list<T> gebruikt ipv List<T> ?

[ Voor 9% gewijzigd door .oisyn op 06-01-2003 17:34 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
yep... die problemen zijn nu opgelost. Ik hoop dat dit topic nog even open mag blijven voor andere template problemen die ik tegenkom..

Verwijderd

Verwijderd schreef op 06 januari 2003 @ 17:12:
code:
1
2
3
template <class T>
class List : public list<T> {
public:
verander class List eens in een andere naam, bla ofzoiets. Zien of ie dan dezelfde fout geeft...

dus
code:
1
2
3
template <class T>
class Bla : public list<T> {
public:


denk dat ie gewoon de list van de STL verward met jou List... een programmeertaal is niet altijd hoofdlettergevoelig, zijn sommige bij die alles in lowercase of juist uppercase interpreteren

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 26-08 16:13

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 06 januari 2003 @ 17:44:
denk dat ie gewoon de list van de STL verward met jou List... een programmeertaal is niet altijd hoofdlettergevoelig, zijn sommige bij die alles in lowercase of juist uppercase interpreteren


heh, C++ is hoofdlettergevoelig, en ik denk niet dat jij een ongure C++ compiler kan vinden die zich hierin vergist :P

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
oke... volgende vraag...

Ik heb hier een class Matrix heb die derived is van std::vector. Nu wordt er een operater() gedefineerd die een: typename Matrix<T>::const_reference returned.
Dit grokt aCC natuurlijk ook niet, maar als ik Matrix verander in vector<T> compileert hij het wel... de vraag is, kan dit... ?

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
List<T> heeft std::list<T> als base type, en dat is een dependent type. Dus geld 14.6.2/3 :
In the definition of a class template or in the definition of a member of such a template that appears outside of the template definition, if a base class of this template depends on a template-parameter, the base class scope is not examined during name lookup until the class template is instantiated. [Example: typedef double A;
template<class T> B {
typedef int A;
};
template<class T> struct X : B<T> {
A a; // a has type double
};
Oftewel, de base class is niet meteen in scope.

Verder geldt [7.1.5.3 Elaborated type specifiers] omdat zowel typename List<T>::const_iterator als typename list<T>::const_iterator de vorm typename ::opt nested-name-specifier identifier hebben.

Voor typename List<T>::const_iterator geldt dan
If name lookup does not find a declaration for the name, the elaborated-type-specifier is ill-formed...
terwijl voor typename list<T>::const_iterator geldt dat 3.4.4 beschrijft waarom deze wel gevonden wordt.

Wat verder "fout" is is de list zonder std:: kwalificatie. Ik gok dat je ergens een using namespace std; hebt staan, en dat dit template daarna komt. Zo'n template moet in een header, wat dus suggereert dat je een using-directive in een header hebt staan. Da's niet goed.

En aCC is niet volledig ANSI compatible - alleen Comeau/EDG kan dat redelijkwerwijs claimen, AFAIK.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Topicstarter
MSalters schreef op 06 January 2003 @ 18:44:
List<T> heeft std::list<T> als base type, en dat is een dependent type. Dus geld 14.6.2/3 :
[...]

Oftewel, de base class is niet meteen in scope.

Verder geldt [7.1.5.3 Elaborated type specifiers] omdat zowel typename List<T>::const_iterator als typename list<T>::const_iterator de vorm typename ::opt nested-name-specifier identifier hebben.

Voor typename List<T>::const_iterator geldt dan
[...]
terwijl voor typename list<T>::const_iterator geldt dat 3.4.4 beschrijft waarom deze wel gevonden wordt.

Wat verder "fout" is is de list zonder std:: kwalificatie. Ik gok dat je ergens een using namespace std; hebt staan, en dat dit template daarna komt. Zo'n template moet in een header, wat dus suggereert dat je een using-directive in een header hebt staan. Da's niet goed.

En aCC is niet volledig ANSI compatible - alleen Comeau/EDG kan dat redelijkwerwijs claimen, AFAIK.
Mag ik hier dus uit concluderen dat GCC hier gewoon fout zit (of niet zo strict is)?
Verder wordt er inderdaad using std::list in de header gebruikt. O-)
(en ja... ik heb het niet geschreven... ik hoef het alleen maar te compilen ;) )

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
Erg lastig om te zeggen, zeker als ik de exacte code niet heb gezien. Ik vermoed dat het gaat om een List<T>::const_iterator in de signature van List<T>::begin() const

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1