2012-03-13 2 views
1

Я пытаюсь передать указатель функции-члена в качестве параметра шаблона. Вот код:C++ компиляция ошибки при использовании функций-членов в качестве параметров шаблона

template <typename Ret, typename T, Ret(T::*mptr)()> 
Handle<Value> get_value (Local<String> name, const AccessorInfo& info) 
{ 
    ... 
} 

template <typename Ret, typename T> 
void mbind (const char* name, Ret (T::*mptr)()) 
{ 
    .... 
    objectTemplate->SetAccessor (String::NewSymbol (name),get_value<Ret,T,mptr>); 
} 

И это ошибка, я получаю:

wrapper.h:184:5: error: ‘mptr’ is not a valid template argument for type ‘int (Cell::*)()’ 
wrapper.h:184:5: error: it must be a pointer-to-member of the form `&X::Y' 
... 

Насколько я знаю, указатели на функции-члены являются действительными параметрами шаблона. Я не понимаю, что случилось с предыдущим кодом. Компилятор, который я использую, - g ++ 4.5.2 под Ubuntu.

Заранее спасибо.

UPDATE:

Это кажется код должен быть неправильно, как mptr является переменной во время выполнения. С другой стороны, предыдущий фрагмент кода компилирует:

http://ideone.com/cv8pq

так ... это правильно? это зависит от компилятора?

ответ

4

mptr - переменная времени выполнения - вы не можете указать ее как параметр шаблона. Проверьте http://ideone.com/CIL4C.

Редактировать

Странная вещь http://ideone.com/cv8pq где-то похожее на ваш код успешно компилируется и работает.

+0

Спасибо. Я добавил указатель на функцию-член как параметр шаблона 'mbind()', и он работает. Вызов выглядит так: 'mbind (" getWidth ");' Теперь мне интересно, есть ли другой способ сделать обращение к 'mbind()' более простым для пользователя (без указания всех этих аргументов шаблона). Спасибо! – user1192525

+0

так ... мы не знаем, действительно ли это (и поддерживается только некоторыми компиляторами) или нет: d – user1192525

1

mbind уже должен принять аргумент шаблона:

template <typename Ret, typename T, Ret (T::*mptr)()> 
void mbind (const char* name) { 
    objectTemplate->SetAccessor (String::NewSymbol (name),get_value<Ret,T,mptr>()); 
} 

PS: Вы забыли () после get_value<>.