Konstanter Ausdruck mit benutzerdefinierten Objekt
-
22-09-2019 - |
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.
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.