2016-04-19 13 views
1

ich eine Basisklasse mit einer rein virtuellen Funktion habe:eine virtuelle Funktion mit einer Templat-Funktion überschreibt

class Allocator 
{ 
public: 
    template< class T > 
    virtual T* allocate(T type) = 0; 
}; 

mit einer abgeleiteten Klasse mit einer Templat-Funktion, die die Konstruktionsabsicht diese virtuelle Funktion außer Kraft zu setzen war:

class StackAllocator: public Allocator 
{ 
public: 
    StackAllocator(size_t size, void* stackStart = nullptr); 

    template< class T> 
    T* allocate(T Type); 
}; 

Mein Design Absicht war es, die in Allocator zuzuweisen außer Kraft gesetzt haben zuzuteilen. Aber nachdem ich dies gelesen habe, habe ich festgestellt, dass der obige Code nicht funktioniert.

Ich fand viele Lösungen, die die Klasse selbst zu einer Vorlage machen, aber in dieser Situation kann ich dies nicht tun, da der StackAllocator selbst beim Kompilieren typenunabhängig sein muss. Und nur die Funktion sollte sich mit den verschiedenen Typen befassen.

Ich fand eine Umgehung, die eine "Zuteilung" -Klasse, die auf einer Pro-Allokation-Basis verwendet wurde, die Zuteilung selbst verwendet, aber das schien verschwenderisch und nicht sehr klar in seiner Anwendung so jetzt bin ich festgefahren mit einfach die virtuelle Funktion loszuwerden und nur die abgeleitete Klasse Vorlagenfunktion zu verwenden.

Irgendwelche Ideen, wie ich dies tun könnte? oder Ideen, wie ich mein Design überarbeiten kann? (Bedenken Sie, dass ich schließlich viele mehr abgeleitet Verteilern zu machen sein wird, so dass die Basis notwendig ist.)

Dank!

+0

g ++: Fehler: Vorlagen können nicht ‚virtuelle‘ –

+0

@ DieterLücking sein, dass der ganze Sinn steckt dahinter, warum er die Frage gestellt. er sagte, dass er weiß, dass der Code, den er gepostet hat, nicht funktionieren kann. – xaxxon

+0

also muss etwas den Typ wissen, den es zugewiesen bekommen möchte - entweder um eine Klasse zu modellieren oder eine Methode in dieser Klasse zu erstellen. Was ist der Sinn einer virtuellen Funktion? das klingt nach einer hübschen Vanilla Factory Methode/Funktion/was auch immer. Einige Beispiele dafür, wie Sie denken, dass Sie das verwenden würden, wenn es funktioniert, wären jedoch hilfreich. Außerdem muss etwas, das einen bestimmten Typ zurückgibt, etwas akzeptieren, um diesen spezifischen Typ zu akzeptieren, also kann man das nicht generisch aufrufen ... – xaxxon

Antwort

0

diesen Code Stellen gearbeitet, wie Sie es verwenden würde?

Sie würden etwas haben, das mit dem allocator parametriert werden würde, aber da es den spezifischen Typen zurückgibt, würde das Ding muss wissen, was mit diesem spezifischen Typ zu tun. das bedeutet, dass der Code entweder nicht generisch ist (was bedeutet, dass es keinen Grund gibt, eine gemeinsame Basisklasse zu haben, weil der Code auf den spezifischen Zuordnertyp spezialisiert sein muss), oder dass ein Template vom Zuordnungstyp übernommen wird, aber dann gibt es keinen Grund, eine virtuelle Funktion zu haben, da Sie einfach die sehr spezifische Factory-Klasse (Zuordner) erstellen können, die dem Template-Typ der Sache entspricht, die diese verwendet.

Sie wollen nicht wirklich eine Methode Templat zuteilen - weil eine bestimmte allocator Unterklasse kann nicht jede Art machen. es kann nur einen bestimmten Typ bilden. Es klingt für mich wie Sie vielleicht Teilspezialisierung verwenden möchten, um dies zu erreichen?

http://en.cppreference.com/w/cpp/language/partial_specialization

und diese teilweise Spezialisierungen von etwas verwenden, die auf die Art Templat ist, die Sie erstellen möchten?

Verwandte Themen