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_type
Val
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.
Vielleicht [tmllight] (https: // github.com/mikael-s-persson/templight) kann dabei helfen. – dyp
Sieht gut aus. Ich werde es versuchen. – alcedine
@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