2013-12-12 6 views
6

Vorsicht: Dies ist GCC 4.1.2. Wir sind auf einer proprietären Embedded-Plattform. Wir können nicht auf einen neuen Compiler aktualisieren. Also C++ 03 + TR1 ist es.verwechslung zwischen std :: [tr1 ::] ref und boost :: ref

Wir haben irgendwo eine Funktion wie folgt:

template<typename T> 
void foo(const boost::any& x) 
{ 
    bar(boost::any_cast<T>(x)); 
} 

, die dann später in einem bind Ausdruck verwendet wird:

std::tr1::bind(&foo<T>, _1); 

Dies erzeugt den folgenden Fehler:

error: call of overloaded 'ref(const boost::any&)' is ambiguous
note: candidates are: std::tr1::reference_wrapper<_Tp> std::tr1::ref(_Tp&) [with _Tp = const boost::any]
note: const boost::reference_wrapper boost::ref(T&) [with T = const boost::any]

Ich verstehe, dass dies ich s Koenig Lookup trifft uns. Mir fehlen jedoch Ideen, wie dieses Problem umgangen werden kann.

Jemand da draußen?

+1

Ist der Mangel an "Ref" in Ihrem Code vorsätzlich? – Simple

+1

@Simple: Wo siehst du einen fehlenden 'ref'? – sbi

+0

Ihre zwei Codebeispiele haben keinen Aufruf von 'ref', während der Fehler dies tut. Ich fragte, ob das Absicht ist oder nicht. Durch Ihre Erwähnung von ADL war ich mir nicht sicher. – Simple

Antwort

5

Definieren Sie eine Version von boost::ref() speziell unter boost::any und lassen Sie es den richtigen Typ zurückgeben. Wahrscheinlich

namespace boost { 
    std::tr1::reference_wrapper<boost::any const> 
    ref(boost::any const& o) { 
     return std::tr1::ref(o); 
    } 
} 
+0

Danke, Dietmar, sehr gute Idee! – sbi