2016-05-04 6 views
2

Meine Frage ist über enable_if Prädikate in der Standard-Bibliothek im Allgemeinen, aber ich werde es im Zusammenhang mit einem Iterator-Typ, wie das ist, wo ich derzeit in dieses Problem läuft.Mein Typ schlägt ein Enable_if-Prädikat in einer Std-Funktion fehl. Gibt es eine Möglichkeit, das Prädikat "zu debuggen"?

Ich habe einen benutzerdefinierten Iterator Typ It, so dass std::iterator_traits<It>::value_typeVal ist. Ich habe diesen Typ erfolgreich mit einem Pre-C++ 11-Standard verwendet, aber jetzt mit C++ 11 (und in einem anderen, im Allgemeinen strengeren Compiler) Kompilierung fehlgeschlagen. Eines der Anwendungsfälle ich habe, ist zu insert into a vector wie

std::vector<Val> v; 
It begin = ... 
It end = ... 
v.insert(v.end(), begin, end); 

der Grund des Compilers für die besondere Überlastung Kandidat insert<_Iter>(iterator, _Iter, _Iter) Ablehnung, die ich ist gewünscht:

no matching member function for call to 'insert' 
candidate template ignored: disabled by 'enable_if' [with _Iter = It] 

in den Header <vector> Sehen, sehe ich, dass die Fehler enable_if Prädikat ist _Is_Iterator. Gibt es eine Möglichkeit, durch die Prädikatsbedingungen zu gehen, um herauszufinden, welche It nicht erfüllt, oder in der Regel eine Möglichkeit, diese Informationen zu finden, ohne manuell alle Anforderungen von InputIterator (oder was auch immer das relevante Konzept sein kann) manuell zu überprüfen ein? Der alte Compiler (für den It funktioniert) ist bcc32 von C++ Builder XE8; Der neue Compiler ist der Clang-basierte 32-Bit-Compiler in C++ Builder 10.1.

+2

Vielleicht [tmllight] (https: // github.com/mikael-s-persson/templight) kann dabei helfen. – dyp

+0

Sieht gut aus. Ich werde es versuchen. – alcedine

+1

@alcedine Mit Sites wie [encppreference.com] (http://en.cppreference.com/w/cpp/concept/InputIterator) ist es ziemlich einfach, die Anforderungen für jedes Konzept einzeln zu überprüfen. – Holt

Antwort

0

Ihr Compiler wird versuchen, Ihnen zu sagen, welcher Parameter falsch ist. Visual Studio gibt Ihnen die Überlast an, die Ihren Spezifikationen am ehesten entspricht und welche Parameter übereinstimmen oder nicht übereinstimmen. Ich glaube, dass Clang und GCC das auch tun.

Sobald Sie den Parameter gelesen haben, der nicht übereinstimmt, liegt es in Ihrer Verantwortung festzustellen, ob der Compiler die richtige Überladung versucht hat und wie Ihr Parameter nicht übereinstimmt.

In den meisten Fällen ist das ziemlich einfach. Aber Sie sind richtig für Iteratoren, es kann ein bisschen entmutigend sein. Aus diesem Grund wird dies in der Regel durch Vererbung von iterator von Ihrem Textbaustein behandelt.

Wenn Sie einen Iterator schreiben, liegt es in Ihrer Verantwortung, die Anforderungen der Iteratorkategorie zu implementieren, von der Sie geerbt haben.

insert erfordert die letzten beiden Parameter "InputIterators". Du solltest also von iterator<input_iterator_tag, T> oder einem der anstrengenderen Tags geerbt haben. Ein "InputIterator" ist definiert als:

  1. A-Typ, die alle Anforderungen an einen "Iterator"
  2. A-Typ entspricht, die "EquallyComparable"
  3. Die reference und value_type Elementtypen definiert sind
  4. Das ist Ungleichheitsoperator ist definiert
  5. Die Zeigerdereferenzierungs- und Elementauswahloperatoren sind definiert
  6. Die Pre-Inkrement und Post-Inkrementieren nt Operatoren sind definiert
+0

Ich fürchte, das ist keine Antwort auf die Frage, die ich gestellt habe. – alcedine

+0

@alcedine Sie versagen 'vector's' enable_if' und Sie möchten die Anforderungen für einen "InputIterator" durchgehen, richtig? Dies sind die Anforderungen. Oder habe ich missverstanden, was du fragst? –

+0

Ich meinte, dass ich durch sie hindurchgehen muss, so wie man Code in einem Debugger durchläuft oder nur etwas genauere Fehlerinformationen erhält (wie in "' It 'erfüllt Bedingung X von C nicht", nicht nur "' It 'nicht befriedigen C ") - nicht manuell von einer Liste überprüfen. Entschuldigung, wenn das nicht klar war. – alcedine

Verwandte Themen