Frage

Dies ist mehr oder weniger Kopie von Boost-docs geklebt und ich halte einen Fehler bekommen (eigentlich eine Menge Fehler)

Ich versuche, um sicherzustellen, dass eine Template-Klasse nur mit Zahlen mit boost verwendet wird. Dies ist eine Übung in boost, anstatt eine Template-Klasse zu machen, dass nur verwendet Zahlen.

#include <boost/utility/enable_if.hpp>
#include <boost/type_traits/is_arithmetic.hpp>

using namespace boost;

template <class T>
class A<T, typename enable_if<is_arithmetic<T> >::type> // <-- this is line 9
{
    int foo;
};

int main() {

    return 0;
}

Die ersten paar Fehler C2143: Syntaxfehler: fehlen; vor '<': Linie 9 C2059: Syntaxfehler: '<': Linie 9 C2899: Typname kann nicht außerhalb einer Template-Deklaration verwendet werden

Visual Studio 2005 btw.

War es hilfreich?

Lösung

Sie erstellt nie wirklich eine Klasse Template namens A. Sie erstellt gerade eine Spezialisierung . Sie müssen sich zuerst mit einem Dummy-Parameter für den Enabler zu arbeiten, um die A Klassenvorlage erstellen.

using namespace boost;

template <class T, class Enable = void>
class A { };

template <class T>
class A<T, typename enable_if<is_arithmetic<T> >::type> 
{
    int foo;
};

Andere Tipps

Vor der A Klassenvorlage spezialisiert möchten Sie haben es zumindest erklären.

Eine Lösung hängt davon ab, was Sie versuchen, zu erreichen, weil das Problem, das Sie um Hilfe fragen über eine versuchte Lösung für ein Problem ist.

Die Boost-Dokumentation von enable_if hat dieses Beispiel, das vielleicht ist das, was Sie wollen:

template <class T, class Enable = void> 
class A { ... };

template <class T>
class A<T, typename enable_if<is_integral<T> >::type> { ... };

template <class T>
class A<T, typename enable_if<is_float<T> >::type> { ... };

Prost & hth.

Sein, weil Sie die ::type am Ende fehlen. Enable_if Konstrukt kann fehleranfällig manchmal sein. Ich benutze diesen kleinen Makro es einfacher zu machen:

#define CLASS_REQUIRES(...) typename boost::enable_if<boost::mpl::and_<__VA_ARGS__, boost::mpl::bool_<true> > >::type

Dann können Sie den obigen Code wie folgt schreiben:

template <class T, class Enable = CLASS_REQUIRES(is_arithmetic<T>)>
class A 
{
    int foo;
};

Es ist viel einfacher auf die Augen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top