2 Stimmen

Herunterstufen von Vorlagen

Warum funktioniert es nicht, wenn man hat:

template
struct X
{
};

dies nicht funktioniert:

X<1> nicht_ok;

aber dies funktioniert:

X<1.0> ok;  

Sollte es nicht einheitliches Verhalten geben? Wenn ich eine int in eine Funktion übergeben kann, die double als Arg nimmt, warum kann ich das nicht mit <> (Template) tun? Gibt es einen Weg, dies zu umgehen (ich brauche dies, um ein Template zu erstellen (statt zwei mit unterschiedlichen Namen), das mir ermöglicht, entweder double&& oder int&& zu übernehmen)? Ich habe versucht, eine Klasse zu übergeben, die eine Konvertierungskonstruktor von int zu dieser Klasse hat, aber das stürzt den VS-Compiler ab. Ich weiß nicht, was ich tun soll. Ich bin blockiert. Ich habe auch Spezialisierung versucht:

template
struct X;

template<>
struct X
{
};

template<>
struct X
{
};

aber Überraschung Überraschung funktioniert nicht. Warum? Ich habe ein primäres Template und dann möchte ich es für bestimmte Typen spezialisieren, warum funktioniert es nicht?

2voto

jpalecek Punkte 45829

Gemäß N3126 (dem endgültigen Entwurf) (14.1/4):

Ein nichttyp-Template-Parameter muss einen der folgenden (optional mit Qualifikatoren) Typen haben:

  • Integraler oder Enumerations-Typ,
  • Zeiger auf Objekt oder Zeiger auf Funktion,
  • Lvalue-Referenz auf Objekt oder Lvalue-Referenz auf Funktion, (Hervorhebung von mir)
  • Zeiger auf Element.

Also sind, wie Sie sehen können, Rvalue-Referenzen überhaupt nicht als Template-Parameter zulässig. Wenn Sie die Einschränkung überwinden wollen, dass Template-Parameter keine doubles sein können, warum drücken Sie Ihren Füllfaktor nicht als Bruch aus:

my_vector<7, 12> ... Füllfaktor mindestens 7/12.

Übrigens könnten Sie den Füllfaktor genauso gut als Konstante speichern (oder als Member), was Ihnen wahrscheinlich weniger Code-Ballast und nicht viel schlechtere Leistung bringen würde.

Das zweite Problem, das Sie gepostet haben (Spezialisierung für double&&), ist etwas völlig anderes, wird unterstützt und funktioniert bei mir (mit g++-4.5):

template
struct X;

template<>
struct X
{
};

template<>
struct X
{
X();
};
X a;
/usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): Relokation 0 hat ungültigen Symbolindex 12
...
/usr/lib/gcc/i486-linux-gnu/4.5.1/../../../../lib/crt1.o: In Funktion "_start":
(.text+0x18): Undefinierter Verweis auf "main"
/home/jirka/tmp/ccqJkazZ.o: In Funktion "__static_initialization_and_destruction_0(int, int)":
:(.text+0x1d): Undefinierter Verweis auf "X::X()"

1voto

Rajivji Punkte 305

Ich bin mir nicht sicher, ob Sie float/double als Vorlagenparameter übergeben können, es soll nur eine Ganzzahl sein. Außerdem werden Gleitkommazahlen nicht so gespeichert, wie sie sind, also ist 1.0 nicht tatsächlich 1.0, sondern könnte 0.999999999999 sein. Daher sollten Sie keine Gleitkommazahlen verwenden, während Sie Vergleiche durchführen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X