Frage

Ich versuche so etwas wie Folgendes:

struct MyType { };

template <typename T>
struct Test
{
    static const MyType * const sm_object;
};

template <>
struct Test<void>
{
    static const MyType * const sm_object;
};

template <typename T> const MyType * const Test<T>::sm_object = new MyType();
template <> const MyType * const Test<void>::sm_object = new MyType();

Ich füge dies in 2 Dateien ein - A.CPP und B.CPP. Ich versuche zu kompilieren und zu bekommen:

error C2998: 'const MyType *Test<void>::sm_object' : cannot be a template definition

Ich gehe davon aus, dass meine C ++ - Syntax schlecht ist, aber ich kann nicht denken, was ich falsch mache.

Ich kann das nicht entfernen template<> Aus der Variablendefinition, da ich dies in mehreren Übersetzungseinheiten benötige, würde dies zu einem Verbindungsfehler führen.

Ich könnte das Feld in eine Basisklasse einfügen und das CRTP verwenden, um eine neue Instanz pro Typ zu erstellen, und dann würde die Spezialisierung nicht im Weg stehen, aber warum funktioniert diese "direkte" Feldinitialisierung nicht? Mir muss ein Stück Syntax fehlen.

Ich benutze VS2003 :(

War es hilfreich?

Lösung

Beurteilung an G ++ Ich denke, Sie müssen die entfernen template<> aus dieser Linie und setzen Sie den Rest aus in nur einer Quelldatei (nicht im Kopfzeile). Da es sich um eine Spezialisierung handelt, ist es wie eine normale Nicht-Template-Statik, die Sie in einem Kopfball nicht definieren.

In einigen .C Datei:

const MyType * const Test<void>::sm_object = new MyType();

Andere Tipps

Ich glaube, dass du so etwas tun willst

struct MyType { };

template <typename T>
struct Test
{
    static const MyType * const sm_object;
    static const MyType* set_object()
    {
        return nullptr;
    }
};

template <>
struct Test<void>
{
    static const MyType * const sm_object;
    static const MyType* set_object()
    {
        return new MyType();
    }
};

template <typename T> 
const MyType * Test<T>::sm_object = Test< T >::set_object();

Ich glaube, der folgende Code könnte für manche Leute von ziemlichem Interesse sein:

#include <stdio.h>
template<class X,int Y>
struct B
{
  X content;
  static const int nr=Y;
};

int main(int, char**)
{
  B<char,1> a;
  B<int,2> b;
  B<int,3> c;
  printf("%d, %d, %d\n",a.nr,b.nr,c.nr);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top