------- Comment #11 from herwig at gdsys dot de  2008-04-02 07:17 -------
(In reply to comment #10)
> Yes. Since the class declaration must be visible from the place where you 
> call this function, and since then also the function's definition 
> (=implementation) is visible, the template should be instantiated at the 
> place where you call the member function. Is this not the case?

No, it is not. And that's because this pure virtual method never gets called
explicitly.

I think the compiler is taking an illegal shortcut in assuming a pure virtual
template method never gets called. When deriving a class from the template, the
vtable is built and it surely has a slot for pvMethod() because it's a virtual
method. So the template is (fully?) instantiated at the point, where I derive
from it. See the following example:

template<class T>
class TBase
{
public:
    virtual void pvMethod() = 0;
    virtual void vMethod();
};

template<class T>
void TBase<T>::pvMethod()
{
}

template<class T>
void TBase<T>::vMethod()
{
}

class TDerived :
    public TBase<TDerived>
{
public:
    void pvMethod();
};

void TDerived::pvMethod()
{
}

int main(int argc, char** argv)
{
    return 0;
}

There is no instance of TDerived whatsoever. But looking at the binary reveals
there is even a TBase<TDerived>::vMethod():

[EMAIL PROTECTED]:~/Programming$ g++ -O0 -Wall test.cpp -o test && objdump -t 
test |
c++filt | grep '\(TBase\|TDerived\)'
08048474 g     F .text  00000005              TDerived::pvMethod()
08048570  w    O .rodata        0000000a              typeinfo name for
TDerived
0804857c  w    O .rodata        0000000c              typeinfo for TDerived
08048560  w    O .rodata        00000010              vtable for TDerived
08048590  w    O .rodata        00000012              typeinfo name for
TBase<TDerived>
08048494  w    F .text  00000005              TBase<TDerived>::vMethod()
08048588  w    O .rodata        00000008              typeinfo for
TBase<TDerived>

Now, in my opinion there must be a TBase<TDerived>::pvMethod(), because
(a) it is legal to specify a fallback implementation,
(b) the slot is surely there, and
(c) as we found out, there is no workaround for it.

Perhaps (c) is a false conclusion because you or I missed something, or (a) is
wrong concerning templates, but nevertheless it's annoying that there's no
clean solution for it. In my code I solved it by making the pure virtual method
virtual only. But now there has been at least one occasion where I forgot to
provide an implementation in a derived class...

If you think my reasoning is right, would you mind reopening the bug?

Best regards,
Björn!


-- 


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

Reply via email to