Различные типы возврата - красная сельдь. Проблема связана с константной перегрузкой метода (т. Е. У вас будет одна и та же проблема, независимо от того, каковы относительные возвращаемые типы). Эта проблема задокументирована здесь и здесь , и использование указанной формы типа возврата не является рекомендуемым решением (будет работать большую часть времени, за исключением некоторых версия MSVC).
Проблема в том, что получение адреса перегруженной функции-члена (либо перегруженной const, либо перегруженным параметром) неоднозначно, поэтому требуется некоторая дополнительная информация.
Решение состоит в том, чтобы привести указатель функции, который позволяет компилятору точно знать, какую из перегруженных функций вы хотите. Самый простой способ сделать это, как я обнаружил, - это определить типы указателей на функции, так как в противном случае строки получают немного противно Вот пример с вашим кодом (компилирует чистый gcc 4.3.4):
#include <vector>
#include <iostream>
#include <algorithm>
#include <boost/bind.hpp>
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
using namespace std;
using namespace boost;
struct A
{
A (const string & name) : m_name(name) {}
string & name () { return m_name; }
const string & name () const { return m_name; }
string m_name;
};
vector<A> av;
//function pointer for non-const version
typedef string& (A::*NameFuncType)(void);
//function pointer for const version
typedef const string& (A::*NameConstFuncType)(void) const;
int main ()
{
av.push_back (A ("some name"));
//'correct' way to call const version w/ boost::bind
find_if(av.begin(), av.end(),
bind(static_cast<NameConstFuncType>(&A::name), _1) == "some name"
);
//call for non-const version w/ boost::lambda::bind
find_if(av.begin(), av.end(),
lambda::bind(static_cast<NameFuncType>(&A::name), lambda::_1) == "some name"
);
return 0;
}