help-gplusplus
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

template<> keyword unexpecting hide virtual members


From: Grizlyk
Subject: template<> keyword unexpecting hide virtual members
Date: 25 Dec 2006 22:19:51 -0800
User-agent: G2/1.0

For gcc version 4.1.0

Using built-in specs.
Target: djgpp
Configured with: /gnu/gcc-4.10/configure djgpp
--prefix=/dev/env/DJDIR --disable -nls --disable-werror
--enable-languages=c,c++,fortran,objc,obj-c++,ada
Thread model: single
gcc version 4.1.0

Without -fpermissive the compiler do not see members of base class,
declared with template<>.
Consider:

namespace Pv{
template<class Tobj>
struct Derived
{
        virtual char    method(char *const)=0;
        char            is_ok(){ return 1; }
};}

namespace Ptest{ template <class Tobj>
struct Derived: public Pv::Derived<Tobj>
{

   char method(char *const ptr)
    {
     return ( ptr && is_ok() )? 1: 0;
     /*
1.cpp: In member function 'char Ptest::Derived<Tobj>::method(char*)':
1.cpp:15: error: there are no arguments to 'is_ok' that depend on a
template parameter, so a declaration of 'is_ok' must be available
1.cpp:15: error: (if you use '-fpermissive', G++ will accept your code,
but allowing the use of an undeclared name is deprecated)
    */

    }
};}


g++ is required explicit qualifier "Pv::Derived<Tobj>::" for all
members of base class. We must do like this:
     return ( ptr && Pv::Derived<Tobj>::is_ok() )? 1: 0;

This is absolutely wrong, all non-private methods, declared in public
base classes, (and which have not hidden by derived declaraions) must
be visible in derived by defaults, without any explicit cast.

It is in general ancient error of g++, which is always very harry to
compile virtual members, but we must not have any differences betwen
the same members, depended only on "virtual" keyword in templates.

For example, in djgpp(g++) version 2.95, any "virtual" member with body
defined in place of declaration (in class description) of a template<T>
class  was not able to use dynamic_cast<T>, due to g++ tried to compile
the member befor T was declared and the same member with the keyword
commented (/* virtual */ ) worked fine.

Is it bug or no? Must i post the bug to?



reply via email to

[Prev in Thread] Current Thread [Next in Thread]