Questo codice ...C++ 11 segnaposto con spinta
int main()
{
using namespace std::placeholders;
ClassA a;
ClassB b, b2;
a.SigA.connect(std::bind(&ClassB::PrintFoo, &b));
a.SigB.connect(std::bind(&ClassB::PrintInt, b, _1));
a.SigB.connect(std::bind(&ClassB::PrintInt, &b2, _1));
a.SigA();
a.SigB(4);
}
dà l'errore di compilazione, "Errore: riferimento a '_1' è ambiguo"
Può essere fissato qualificando pienamente il segnaposto ...
int main()
{
// using namespace std::placeholders;
ClassA a;
ClassB b, b2;
a.SigA.connect(std::bind(&ClassB::PrintFoo, &b));
a.SigB.connect(std::bind(&ClassB::PrintInt, b, std::placeholders::_1));
a.SigB.connect(std::bind(&ClassB::PrintInt, &b2, std::placeholders::_1));
a.SigA();
a.SigB(4);
}
... ma perché il primo frammento di codice non funziona?
EDIT
solo per evitare ogni ambiguità, io sono la compilazione con Clang e Boost 1.52 con --stdlib=libc++ -std=c++0x
e l'intero blocco di codice è questo ...
#include <boost/signals2.hpp>
#include <iostream>
struct ClassA
{
boost::signals2::signal<void()> SigA;
boost::signals2::signal<void (int)> SigB;
};
struct ClassB
{
void PrintFoo() { std::cout << "Foo" << std::endl; }
void PrintInt(int i) { std::cout << "Bar: " << i << std::endl; }
};
int main()
{
// using namespace std::placeholders;
ClassA a;
ClassB b, b2;
a.SigA.connect(std::bind(&ClassB::PrintFoo, &b));
a.SigB.connect(std::bind(&ClassB::PrintInt, b, std::placeholders::_1));
a.SigB.connect(std::bind(&ClassB::PrintInt, &b2, std::placeholders::_1));
a.SigA();
a.SigB(4);
}
Cosa ... compilatore stai usando? Modifica: non importa, 'clang' usa' __1' come la sua strana cosa dello spazio dei nomi. – Xymostech
Se c'è qualcos'altro chiamato _1 in ambito, allora si otterrà questo errore. [EDIT] un po 'troppo tardi! – Slicedpan