Verwenden Sie die nicht vorlagenbasierte Version der Klasse als übergeordnetes Element

Ich arbeite an der Portierung eines Projekts von C# nach C ++ und habe ein Problem bei der Verwendung von Templates. Ich brauche sowohl eine nicht-templated als auch eine templated Version einer Klasse, die eine andere Klasse hat, dh:

class DataBuffer//Holds generic databuffer functions (getting size in bytes etc)
{
public:
    int32 getVal() { return 10; }
};

template 
class DataBuffer : public DataBuffer//Able to retrieve data as a type...
{
public:
    int32 getSizeOfT() { return sizeof(T); }
};

Ich habe Methoden, die jede Art von DataBuffer als Parameter akzeptieren, also ist das Templating der gesamten Klasse nicht möglich. Gibt es eine Möglichkeit, dies zu tun, ohne die Basisklasse umzubenennen?

Jede Hilfe würde sehr geschätzt werden.

BEARBEITEN: Dieser Code kompiliert nicht und gibt den folgenden Fehler zur Kompilierzeit aus:

error C2989: 'DataBuffer' : class template has already been declared as a non-class template
0
Sie können nicht mehrere Klassen mit demselben Namen erstellen.
hinzugefügt der Autor Jonathan Wood, Quelle

3 Antworten

Leider gibt es dazu keine Möglichkeit. Ich denke, der relevante Teil des Standards ist:

Eine Klassenvorlage darf nicht den gleichen Namen wie jede andere Vorlage haben,   Klasse, Funktion, Objekt, Enumeration, Enumerator, Namespace oder Typ   im gleichen Umfang (3.3), außer wie in (14.5.4) angegeben. Außer dass   eine Funktionsvorlage kann entweder durch (Nicht-Template) überladen werden   Funktionen mit dem gleichen Namen oder andere Funktionsvorlagen mit dem   gleicher Name (14.8.3), ein Vorlagenname, der im Namensraumbereich oder in deklariert ist   Klassenumfang soll in diesem Umfang einzigartig sein.

Die Methoden, die jeden Typ von DataBuffer akzeptieren sollten, könnten jedoch auch als Vorlage verwendet werden, so dass das Erben von einer gemeinsamen Basis unnötig würde.

0
hinzugefügt
Ich habe beschlossen, die Klasse databuffers so zu modifizieren, dass sie nur über Vorlagen verfügt. So kann ich meine Funktionen/Methoden so weiterverwenden, wie sie waren. Danke für Ihre Hilfe.
hinzugefügt der Autor Mattiemus, Quelle

Sie müssen der Klasse und der Klassenvorlage verschiedene Namen geben oder sie in verschiedene Namespaces einfügen: Klassen und Klassenvorlagen können nicht genau denselben Namen haben.

0
hinzugefügt

Wie der Fehler sagt, kann eine Klassenvorlage nicht den gleichen Namen wie ein Nicht-Template haben.

Sie müssen entweder die Basisklasse oder die Vorlage umbenennen.

0
hinzugefügt