2011-10-02 18 views
5

Qualcosa come, per esempio,Le specializzazioni di una funzione modello possono essere virtuali?

class A { 
    template<typename T> T DoStuff(); 
    template<> virtual int DoStuff<int>() = 0; 
}; 

Visual Studio 2010 dice di no, ma ho una strana sensazione che ho semplicemente incasinato la sintassi. Le specializzazioni complete esplicite di un modello di funzione membro possono essere virtuali?

+0

Si dovrebbe ancora ricevere un errore anche se si rilascia 'virtuale', giusto? –

+1

Anche se legale. Perché dovresti rendere più difficile la vita dei manutentori scrivendola. Ricorda che possiede un'ascia. –

+0

@ Tux-D: Perché, mentre potrei creare funzioni DoStuffInt per circa cinque o più tipi diversi, non è proprio la soluzione ideale, e in secondo luogo, perché le intestazioni di Windows hanno un miliardo di problemi di perdita di macro che questo eviterebbe, mentre alcuni i miei normali nomi di funzioni avrebbero un problema. – Puppy

risposta

8

Le specializzazioni esplicite non sono legali all'interno di una classe. Anche se potessi renderlo una specializzazione parziale, potresti comunque imbatterti nel problema "i modelli non possono essere virtuali".

n3290, § 14.5.2 stati: modello di funzione

Un membro non è virtuale.

e dà questo esempio:

template <class T> struct AA { 
    template <class C> virtual void g(C); // error 
    virtual void f(); // OK 
}; 

Prima di andare a dichiarare che la funzione di membro template non contano per le sostituzioni virtuali troppo.

+0

Non è possibile specializzare parzialmente un modello di funzione. http://www.gotw.ca/publications/mill17.htm –

+0

@ n.m - vero, era più di un'ipotesi "anche se". Lo chiarirò nel testo però. – Flexo

2

In base al modello di funzione membro standard C++ 98 non deve essere virtuale. http://www.kuzbass.ru:8086/docs/isocpp/template.html.

-3- Un modello di funzione membro non deve essere virtuale. [Esempio:

template <class T> struct AA { 
    template <class C> virtual void g(C); // error 
    virtual void f();      // OK 
}; 
0

È possibile ottenere un effetto simile da sovraccaricare il modello di funzione con una funzione virtuale non-template regolare.

Problemi correlati