Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > mem_fun_ref и перегруженные методы класса


Автор: Kappac 16.6.2010, 15:00
Доброго всем времени суток! 
Есть ли возможность сказать mem_fun_ref или mem_fun какой конкретно вариант функции использовать?

Пример:

Метод magick класса Image библиотеки ImageMagick перегружен:
string & magick();
void & magick(const string &);

Соответсвенно следующий код не компилится( компилятор: gсс версия 4.4.3 (Gentoo 4.4.3-r2 p1.2) ):

Код

#include <Magick++.h>
#include <vector>
#include <functional>
#include <algorithm>

using namespace Magick;
using namespace std;

vector<Image> images;

images.resize(3);

images.push_back(Image("file0.name"));
images.push_back(Image("file1.name"));
images.push_back(Image("file2.name"));

for_each( images.begin(), images.end(), bind2nd(mem_fun_ref(&Image::magick), "RGBA")) );



ошибка:
Код

вызов перегруженной функции ‘mem_fun_ref(<unresolved overloaded function type>)’ неоднозначен 
/usr/lib/gcc/x86_64-pc-linux-gnu/4.4.3/include/g++-v4/bits/stl_function.h:699: замечание: претенденты:
std::mem_fun1_ref_t<_Ret, _Tp, _Arg> std::mem_fun_ref(_Ret(_Tp::*)(_Arg)) [with _Ret = void, _Tp = Magick::Image, _Arg = const std::string&] 
/usr/lib/gcc/x86_64-pc-linux-gnu/4.4.3/include/g++-v4/bits/stl_function.h:684: замечание:
std::const_mem_fun_ref_t<_Ret, _Tp> std::mem_fun_ref(_Ret
(_Tp::*)()const) [with _Ret = std::string, _Tp = Magick::Image]
 

Вопрос: как решить эту задачу без написания собственного функтора и средствами STL, если возможно?

Автор: jonie 16.6.2010, 18:48
специализируйте шаблон явно:
Код

    mem_fun_ref<void>(&Image::magick);

например.
Для тех кто хочет попробывать вот вам простой код:
Код

using namespace std;

class Image
{
public:
    string & magick() {}
    void  magick(const string &) {}
};

int _tmain(int argc, _TCHAR* argv[])
{
    vector<Image> imgs;
    imgs.push_back(Image());
    imgs.push_back(Image());
    imgs.push_back(Image());

    vector <string> idx (imgs.size());

    mem_fun_ref(&Image::magick); //error here , что и понятно

    return 0;
}


Автор: Kappac 17.6.2010, 10:04
Спасибо! 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)