2010-05-12 3 views
5

Umgebung: VS2005 C++ mit STLPort 5.1.4.std :: string einfügen Methode hat mehrdeutige Überladungen?

Kompilieren den folgenden Code-Schnipsel:

std::string copied = "asdf"; 
char ch = 's'; 
copied.insert(0,1,ch); 

Ich erhalte eine Fehlermeldung:

Error 1 error C2668: 'stlpx_std::basic_string<_CharT,_Traits,_Alloc>::insert' : ambiguous call to overloaded function 

Es scheint, dass das Problem der Einsatz Methodenaufruf auf dem String-Objekt ist.

Die beiden definierten Überlastungen

void insert (iterator p, size_t n, char c); 
string& insert (size_t pos1, size_t n, char c); 

Aber gegeben sind, dass STLPort ein einfaches Zeichen verwendet * als Iterator, ist die wörtliche Null in der insert-Methode in meinem Code nicht eindeutig.

So, während ich einfach das Problem, indem Hinting wie

copied.insert(size_t(0),1,ch); 

Meine Frage ist, überwinden: ist diese Überlastung und mögliche Mehrdeutigkeit vorsätzliche in der Beschreibung? Oder eher eine unbeabsichtigte Nebenwirkung der spezifischen STLPort-Implementierung?

(Beachten Sie, dass der von Microsoft bereitgestellte STL dieses Problem nicht haben, da es eine Klasse für das Iterator hat, anstelle einem nackten Zeiger)

+0

mehr streng sein: es 'copied.insert sein sollte (static_cast (0), static_cast (1), ch)' – ereOn

+0

@ereOn: Der zweite 'static_cast' nicht notwendig ist, da beide Überlastungen einen nehmen' size_t' als zweiter Parameter. –

+1

Nicht unnötig wegen möglicher zukünftiger Überlastungen und des unsicheren Integraltyps '1'. – Marius

Antwort

0

Wenn Sie den differents ganzen Zahlen Typen unterscheiden, gibt es keine Zweideutigkeit an alle.

Good Practices Befehle zum Speichern von Puffergrößen in size_t (oder ssize_t) Typen, nicht int.

Wenn Sie dem zustimmen, macht das Aufrufen von insert(int, int, char) keinen Sinn, da die beiden ersten Argumente eine "Puffergröße" sein sollen.

Wenn es keine implizite Konvertierung von int zu size_t gab, konnten Sie nicht einmal insert() auf diese Weise aufrufen.

0

Absichtlich oder nicht, das Problem hat mehr mit der Semantik von 0 als die Elementfunktionen in Frage zu tun. Vielleicht waren die Designer der Microsoft-Bibliothek (sie benutzten Dinkumware beim letzten Mal, wenn ich nachprüfte) in dieser Hinsicht vorsichtiger.

+0

Dinkumware würde dieses Problem wahrscheinlich nicht haben: Die Verwendung echter Iteratoren mildert die Mehrdeutigkeit. –

Verwandte Themen