Linker: Templates + .cpp Datei = böse?
-
ipsec schrieb:
Kleine Anmerkung zum Code: statt
InputIterator::value_typesolltest du besserstd::iterator_traits<InputIterator>::value_typeverwenden.weshalb ?
Meep Meep
-
Weil auch reine Pointer als Iteratoren verwendet werden könnten - und die haben keine Typedefs für Werttyp etc. (iterator_traits<> sammelt diese Hilfstypen je Iteratorklasse - die Standardversion verwendet It::value_type etc, aber eine Spezialisierung für Pointer überschreibt die Angaben)
-
Der Standard schreibt vor dass
std::iterator_traits<InputIterator>::value_typefunktionieren muss.
Er schreibt nicht vor dassInputIterator::value_typefunktionieren muss (und funktioniert auch nicht, z.B. für Zeiger wie CStoll schon geschrieben hat).Und man sollte sinnvollerweise das verwenden, was laut Standard funktionieren muss, und nicht das, was bloss zufälligerweise manchmal funktioniert.
EDIT: sollte man nicht überhaupt
std::iterator_traits<InputIterator>::pointerstattstd::iterator_traits<InputIterator>::value_type*verwenden?
-
hustbaer schrieb:
EDIT: sollte man nicht überhaupt
std::iterator_traits<InputIterator>::pointerstattstd::iterator_traits<InputIterator>::value_type*verwenden?Ja, sollte man

-
Gibts dafür einen Grund? In der Funktion selbst werfe ich ja sowieso Zeiger rein.
-
314159265358979 schrieb:
Gibts dafür einen Grund? In der Funktion selbst werfe ich ja sowieso Zeiger rein.
Wenn du irgendwo in dem Funktionstemplates etwas machst, das nur mit rohen Zeigern funktioniert, dann kannst du auch value_type* lassen. Wenn (rein theoretisch) InputIterator::pointer auch ein anderer pointer-Typ sein kann und das dem Funktioniere des Templates keinen Abbruch tut, dann wäre es unnötig, durch Einschränkung des Typen auf value_type* die Verwendbarkeit einzuschränken.
-
std::iterator_traits<InputIterator>::pointerkommt doch ursprünglich von dem ganzen near/far Gedöns, nicht?
Wobei man natürlich auch Smart-Pointer erlauben könnte.
-
Der Standard erlaubt gar keine proxies in den Containern (mal vom Beschiss in vector<bool> abgesehen). Daher muss eigentlich(!) pointer_type = value_type* sein, genauso wie reference_type = value_type* (wie gesagt, bis auf den beschiss in vector<bool>). Ausserdem gibt kein container irgendwo pointer_type zurück. von daher...
-
Hast du schonmal daran gedacht, daß auch Dinge außerhalb des C++ Standards existieren, die in der Lage sind, STL-taugliche Iteratoren zu liefern?
(PS: Wenn schon, dann ist reference == value_type& ;))
-
314159265358979 schrieb:
pimpl kommt nicht in Frage, dafür ist eine Heap-Allokation erforderlich, und die ist zu teuer.
Manchmal kommst du um Pimpl nicht herum, wenn du Abhängigkeiten verringern willst. Verwende in diesen Fällen einen speziellen Allokator.
pumuckl schrieb:
Das war "export", was das Gegenteil von neu, nämlich deprecated ist.
"removed" triffts besser,
exportist bald Geschichte
-
otze schrieb:
Der Standard erlaubt gar keine proxies in den Containern (mal vom Beschiss in vector<bool> abgesehen). (...)
Wer spricht denn von Proxies?
Referenz != Zeiger
std::iterator_traits<T>::reference != std::iterator_traits<T>::pointerIIRC gibt es keine Container-Funktionen die einen Zeiger zurückliefern würden. Von daher kann es auch keine "Proxy-Zeiger" geben.
Trotzdem ermöglichtstd::iterator_traits<T>::pointeres z.B. einenT __far*statt eines einfachenT*zu verwenden.