The piece of code attached compiled without errors under gcc 3.3.3 (Red Hat 
Linux), but failed with 3.4.2 (Windows XP) and 3.4.3 (Solaris 2.8).

The information that I am sending in this report all pertains to 3.4.3 on 
Solaris.  But I also installed a version of Dev-C++ which installs on Windows 
XP and it has g++ 3.4.2 and the same failure exists there.

<289 /us/fradish/C++ > /us/bfsbld/Compilers/gcc/3.4.3/sparc-sun-
solaris2.7/bin/g++ -v
Reading specs from /us/bfsbld/Compilers/gcc/3.4.3/sparc-sun-
solaris2.7/lib/gcc/sparc-sun-solaris2.7/3.4.3/specs
Configured with: /us/bfsbld/Compilers/gcc/3.4.3/src/gcc/configure --
prefix=/us/bfsbld/Compilers/gcc/3.4.3/sparc-sun-solaris2.7 --disable-shared --
disable-multilib
Thread model: posix
gcc version 3.4.3

<290 /us/fradish/C++ > uname -a
SunOS bfs-qah51 5.8 Generic_117350-01 sun4u sparc SUNW,Ultra-5_10 

======== build script ===================
#!/bin/csh

set MAINDIR="/us/bfsbld/Compilers/gcc/3.4.3/sparc-sun-solaris2.7"
set GCC="${MAINDIR}/bin/g++"
set LIB="${MAINDIR}/lib"
set INCLUDE="${MAINDIR}/include"

set file=TListExample3WithScope.cpp

${GCC} -c $file -I ${INCLUDE} -save-temps
=======================================

In the attached file TListExample3WithScope.cpp, in line 84 
(SLList::append()), you will see an unscoped
call to the inherited method bottom() and in line 85 is a commented-out 
call that is scoped by the base class name.  And in line 86 is an 
unscoped reference to "cursor".  If I use the unscoped versions of 
these, I get these errors:

<294 /us/fradish/C++ >  csh build
TListExample3WithScope.cpp: In member function `bool SLList<T>::append(const 
T&)':
TListExample3WithScope.cpp:84: error: there are no arguments to `bottom' that 
depend on a template parameter, so a declaration of `bottom' must be available
TListExample3WithScope.cpp:84: error: (if you use `-fpermissive', G++ will 
accept your code, but allowing the use of an undeclared name is deprecated)
TListExample3WithScope.cpp:86: error: `cursor' undeclared (first use this 
function)
TListExample3WithScope.cpp:86: error: (Each undeclared identifier is reported 
only once for each function it appears in.)

If I use -fpermissive, the first error will just become a warning, but the 
second remains.  If I comile the same thing on
gcc 3.3.3, I do not encounter these errors.  If I use all of the scoped 
versions of all of these calls, the code compiles
and runs fine even on 3.4.x.

I can try to install a newer version of gcc (I guess you're up around 4.01 
now), but wanted to report this.
If this is not an error, but something that I am doing wrong that was 
tolerated in 3.3.3, can you let me
know?

P.S.  Here is the info for the 3.3.3 build where this isn't a problem:

Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/3.3.3/specs
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --
infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-
checking --disable-libunwind-exceptions --with-system-zlib --enable-
__cxa_atexit --host=i386-redhat-linux
Thread model: posix
gcc version 3.3.3 20040412 (Red Hat Linux 3.3.3-7)

=========================================================
//TListExample3WithScope.cpp
#include <cstdlib>
#include <iostream>

using namespace std;

template <typename T> struct SLEntry { 
    SLEntry<T> *next; 
    T data;
    SLEntry( const T &dat, SLEntry<T> *nxt=NULL ) {
      data = dat;
      next = nxt;
    }
    ~SLEntry(){}
};       

template <typename T> class SLListCursor { 
  private: 
  protected: 
    SLEntry<T> *head; 
    SLEntry<T> *cursor; 
    SLListCursor(SLEntry<T> *h=NULL, SLEntry<T> *c=NULL){ 
                       head = h; cursor = c; }
  public: 
    SLListCursor( const SLListCursor<T> & );
    ~SLListCursor(){} 
    void top() { cursor = head; }
    void bottom();
    void next();
    bool atEnd();
    bool getData( T & );
};

template <typename T>
SLListCursor<T>::SLListCursor( const SLListCursor<T> &sl) { 
     head = sl.head;
     cursor = sl.cursor; 
}

template <typename T>
void SLListCursor<T>::bottom() {
    SLEntry<T> *previous = NULL; 

    if ( cursor == NULL ) { top(); } 

    while ( cursor != NULL) { 
      previous = cursor; 
      next(); 
    } 
    cursor = previous; 
}

template <typename T>
void SLListCursor<T>::next() {
    if ( cursor != NULL) { 
      cursor = cursor->next; 
        }
}

template <typename T>
bool SLListCursor<T>::getData(T &dat) {
    if ( cursor != NULL) { 
      dat = cursor->data; 
      return true;
        }
    return false;
} 

template <typename T>
bool SLListCursor<T>::atEnd() {
    if ( cursor == NULL) { 
      return true;
        }
    return false;
} 
 
template <typename T> class SLList: public SLListCursor<T> { 
  private: 
  protected: 
  public: 
    SLList(): SLListCursor<T>() {}
    ~SLList(){}
    // Compiler doesn't appear to see inherited methods/data
    bool append( const T &value ) {
      bottom();
      //SLListCursor<T>::bottom();
      SLEntry<T> *tail = cursor; 
      //SLEntry<T> *tail = SLListCursor<T>::cursor; 
      SLEntry<T> *newEnt = new SLEntry<T>( value, NULL ); 
 
      SLListCursor<T>::cursor = newEnt; 
      if ( SLListCursor<T>::head == NULL ) { 
        SLListCursor<T>::head = SLListCursor<T>::cursor; 
      } 
      if ( tail != NULL) { 
        tail->next = SLListCursor<T>::cursor; 
          } 
      return true; 
   }

}; 

typedef SLList<int> IList;
typedef SLListCursor<int> IListCursor;

int main(int argc, char *argv[])
{
    IList ilist;

    for ( int j = 0; j < 5; j++ ) {
      ilist.append(j);
    }

    ilist.top();
    IListCursor icursor( ilist );
    int i = 0;
    int k = 0;
    while ( ilist.getData( k ) ) {
      printf("ilist data = %d\n", k );
      icursor.top();
      while ( icursor.getData( i ) ) {
        printf("  icursor data = %d\n", i );
        icursor.next();
      }
      ilist.next();
    }
    
    return 0;
}

-- 
           Summary: Difficulty accessing base template members from derived
                    template
           Product: gcc
           Version: 3.4.3
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: frank dot radish at marconi dot com
                CC: gcc-bugs at gcc dot gnu dot org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23137

Reply via email to