Frage

Ich versuche, einen Augenblick einer benutzerdefinierten Klasse als Template-Parameter zu verwenden.

class X {
public:
  X() {};
};

template <class Foo, Foo foo>
struct Bar {

};
const X x;
Bar<X, x> foo;

Der Compiler stellt fest, dass x nicht in einem konstanten Ausdruck erscheinen. Warum das? Es gibt alles, um das Objekt bei der Kompilierung zu konstruieren gegeben.

War es hilfreich?

Lösung

Sie können es nicht tun. Standard 14.1 sagt:

  

4 Ein nicht-Typ Template-Parameter werden nach einem der folgenden (optional cv-qualifiziert) Typen haben:
  - Integral oder Aufzählungstyp,
  - Zeiger auf Objekt oder Zeiger auf Funktion,
  - Verweis auf Objekt oder Verweis auf Funktion,
  - Zeiger auf Member
.    5 [Anmerkung: andere Typen sind entweder explizit unten nicht zulässig oder implizit in den Vorschriften über die Form von template-Argumente   (14.3). -Ende note] Die Top-Level-cv-Qualifikationsspiele auf dem Template-Parameter ignoriert werden, wenn ihre Bestimmung   Art.

Andere Tipps

Wie andere haben darauf hingewiesen, man kann es nicht tun. Solange Sie nicht Meta-Programmierung Spiele spielen, die normale Art und Weise eine tatsächliche Instanz einer Klasse zu übergeben ist im Konstruktor:

template <class Foo>
struct Bar {
    Bar( const Foo & f ) {
      ...
    }
};

Template-Parameter können Typen oder integrale Konstanten sein. X ist ein Typ, aber x nicht. Sie können auch nicht konstant Gleitkommawerte verwenden.

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