 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Ludwig Pumberger Guest
|
Posted: Wed Sep 03, 2003 4:55 pm Post subject: Re: Unerwünschter Konstruktoraufruf |
|
|
christian sulzer schrieb:
| Quote: | template <class T
class MemMappedList {
public:
class iterator { /*...*/ };
// ctor 1
MemMappedList (const char *filename, size_t size, const T &el);
// ctor 2
template
MemMappedList (const char *filename, It first, It last);
};
Beim Anlegen einer Instanz:
MemMappedList
wird der ctor 2 aufgerufen, obwohl ich eigentlich ctor 1 wollte.
Anscheinend wird also der template-ctor bevorzugt ?
|
Nein. In der Reihenfolge der Überladungen werden nicht-Templates bevorzugt.
Allerdings wird ein exakter Treffer einer Variante die Konvertierungen oder
Promotions benötigt vorgezogen. In obigem Fall sieht der Compiler const
char *, int, int. So einen c'tor gibt es nicht. Also erzeugt er ihn aus dem
Template auch wenn das Template mit diesem Typ nicht fehlerfrei instanziert
werden kann (z.B. weil operator * fehlt). Die einzige Möglichkeit ist ein
static_cast<size_t> auf dem zweiten Parameter (oder gleich die Übergabe
eines size_t Wertes).
| Quote: | Das Schlüsselwort "explicit" in ctor 1 bringt in dem Fall
auch nicht den gewünschten Effekt.
|
Nein explicit verhindert nur ein a b = c; und erzwingt ein a b(c);
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Ludwig Pumberger Guest
|
Posted: Wed Sep 03, 2003 7:59 pm Post subject: Re: Unerwünschter Konstruktoraufruf |
|
|
christian sulzer schrieb:
| Quote: | Verstehe...
Aber z.B. in der STL - list - Klasse müßte es ja auch ähnliche
Konstruktoren
geben (Pseudocode ohne Allokatoren-Parameter):
explicit list (size_type n, const T &elem = T ());
// bzw.
template <class It
list (It first, It last);
std::list
std::list <int> ilist2 (ilist.begin (), ilist.end ());
gibt keine Mehrdeutigkeiten.
|
list hat keinen solchen Konstruktor. Aber vector! Und da wird vorderhand
auch der iterator, iterator C'tor aufgerufen, aber der "erkennt" dass sein
Argument kein Iterator ist und verhält sich daraufhin richtig.
| Quote: | Na ja, vielleicht sollte ich mir mal in der STL-Impl. ansehen,
wie die Gurus das gelöst haben.
|
Das ist jetzt die berühmte Übung für den Leser *g*.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|