2017-11-18 1 views
2

Ich habe einen Unit-Test mit Boost-Bibliothek-Test-Framework erstellt und ein Problem mit der Verwendung von Std :: Bind Platzhalter zusammen mit der genannten Bibliothek.Problem mit der Verwendung von Std :: Bind Platzhalter zusammen mit Boost-Bibliothek

Wenn ich ausdrücklich std::placeholders:: + _1 verwenden, es funktioniert gut:

std::bind(&TestFixture::concatStrings, this, std::placeholders::_1, std::placeholders::_2) 

Aber wenn ich die std::placeholders:: und direkt _1 verwenden weglassen, so führt dies zu einem Übersetzungsfehler:

Error 1 error C2664: 'std::string std::_Pmf_wrap<std::string (__thiscall TestFixture::*)(const std::string &,const std::string &),std::string,TestFixture,const std::string &,const std::string &>::operator()(_Farg0 &,const std::string &,const std::string &) const' : cannot convert argument 2 from 'boost::arg<1>' to 'const std::string &' C:\APPS\msvs2013\VC\include\functional 1149 1 test 

Lambda-Verwendung , ist die beste Lösung, die ich mir vorstellen kann:

[&](const std::string& x, const std::string& y){ return concatStrings(x, y); } 

Ich möchte nur verstehen, wenn Methoden verwendet, die in std Konflikte mit Boost-Bibliothek, wie die std :: bind definiert. Danke im Voraus.

Antwort

2

If I explicitly use std::placeholders:: + _1, it works fine:

Also wenn Sie es richtig verwenden, und wie dokumentiert, funktioniert es.

But if I omit the std::placeholders:: and directly use _1, it results to a compilation error:

Und wenn Sie es falsch verwenden, funktioniert es nicht.

I just want to understand if using methods defined in std conflicts with boost library, such as the std::bind.

Ja, es gibt einen Namenskonflikt. Es gibt keinen Konflikt per se, aber leider haben Boost Bind ihre Platzhalter historisch in den globalen Namensraum gestellt.

Es ist durchaus möglich, Boost-Bind ::_1 Boost Phoenix zu verwenden, Boost-Geist boost::spirit::qi::_1 und std::bind zusammen, aber ja, können Sie die Platzhalter qualifizieren müssen. Alternativ können Sie Ihre eigenen Aliase verwenden.


PS. In diesem Fall sollte es möglich sein, std::mem_fn zu verwenden. Wenn Sie lambdas _prefer verwenden, um [&] nicht zu verwenden, da es eine unsichere Gewohnheit ist. In Ihrem Fall mussten Sie nur [this] erfassen oder wenn Sie wollten, [=].

+0

Hallo! Danke für deine Antwort. Die Verwendung von '_1' funktioniert gut mit boost :: bind. Wenn ich jedoch explizit std :: bind verwende, sollte ich 'std :: placeholders :: _ 1' verwenden. Danke, dass Sie auf die Aufnahme im Lambda hingewiesen haben, ich werde es mir zur Gewohnheit machen, meine Aufnahme sicher zu wählen. :) – cawols

Verwandte Themen