Newsgroup: it.comp.lang.c++
Titolo: Metodi virtuali puri in template

Ciao a tutti.
Ho una classe
template<typename T> class A
{
...
virtual void foo() = 0;
...
};
e una classe che eredita:
template<typename T> class B : public A<T>
{
...
virtual void foo(){...};
...
};
ora se eseguo l'istanziazione esplicita (queste classi sono in una 
libreria e vorrei evitare un file .h con tutte le definizioni)
template class A<long>;
template class B<long>;
ottengo una warning dal compilatore che mi avverte che non ho definito 
completamente la classe A.
In particolare:
... : warning C4661: 'void __thiscall A<int>::foo()' : no suitable 
definition provided for explicit template instantiation request
(visual c++ 6.0)
Se non eseguo l'instanziazione esplicita di A correttamente non ho le 
warning, ma non linka in quanto ho altri metodi non virtuali definiti in A.
Potrei disattivare la warning in questione ma non mi piace.
Ho invece notato che se fornisco una definizione "dummy" per il metodo 
foo della classe A, č tutto ok.
Il punto č:
E' legale definire un metodo dichiarato come virtuale puro?
La mia doc. dice:
"An abstract class contains at least one pure virtual function. Specify 
a virtual function as pure by placing = 0 at the end of its declaration. 
You don't have to supply a definition for a pure virtual function."
Non mi č ben chiaro il significato di ..*You don't have to* supply...
non devi fornire č da interpretare come
a- non sei tenuto a fornire (ma se fornisci non succede nulla)
b- DEVI NON fornire (guai se ti attenti)
In effetti il mio compilatore sembra interpretare come (a), in effetti 
io ho fornito una definizione non richiesta e non ha battuto ciglio...
Ma secondo lo std č proprio cosě?
Grazie
b.b.

 b- DEVI NON fornire (guai se ti attenti)
La traduzione piu' letterale e' "Non hai bisogno di fornire..."
Ciao,
Nicola

 
Ok, grazie.
Quindi posso dire che è corretta la (a) e che il compilatore ignora la 
definizione superflua.
Ciao
b.b.

 definirlo? perché?
I distruttori dichiarati virtuali puri devono comunque essere definiti,
perche' devono poter essere richiamati dai distruttori di classi
derivate.
Ciao,
Nicola

 
Ok, ci sono.
Mi chiedevo che senso avesse dichiarare un distruttore virtuale puro, ed 
ho trovato una interessante "discussione": 
http://cpptips.hyperformix.com/cpptips/pure_virt_dtor3
In pratica dice che il dtor virtuale puro può servire per forzare una 
classe ad essere astratta quando tutti gli altri metodi hanno cmq 
un'implementazione di default...
Grazie e ciao
b.b.

 straniera, non da eventuali traduzioni.
Ma in inglese i sostantivi non hanno genere grammaticale. Quindi, che
facciamo? Usiamo sempre il maschile?  Per me va bene. Bisogna solo
convincere qualche milionata di persone a dire "un mail", "un directory",
"un workstation", "uno shell"...
Max

Non hai tutti i torti... Resta il fatto che warning e' maschile, non
fosse altro che perche' lo dico io :-)
Tra parentesi, a proposito del messaggio precedente di Bi.Bi., io non
tradurrei attenzioni (femminili) con warning...
Ciao,
Nicola

 tradurrei attenzioni (femminili) con warning...
Boh...
In effetti googlando escono molti più "il warning" che "la warning".
Concordo che *il* suona meglio che *la*
Tuttavia al plurale cambia...
Pensandoci bene, IMHO vale la tab:
il w. meglio di la w.
le w. meglio di i w.
una w. uguale a un w.
P.S. Naturalmente stiamo scherzando!! vero ? :)
Per quanto riguarda la traduzione, credo che il succo combi poco.
Ciao
b.b.

Mi sa che il mio sottile umorismo e' sfuggito all'attenzione...
Ciao,
Nicola