Но в чем тогда проблема?

We use cookies. Read the Privacy and Cookie Policy

Но в чем тогда проблема?

Обобщенный указатель всего лишь «прикидывается» указателем и не может быть использован везде, где используются обычные указатели. Например, возьмем адаптер указателя на функцию-член класса из STL:

template<class R, class T>

mem_fun_t<R, T> mem_fun(R (T::*pm)());

template<class R, class T>

struct mem_fun_t: public unary_function<T *, R> {

 explicit mem_fun_t(R (T::*pm)());

 R operator()(T *p);

};

Видно, что когда мы вызываем mem_fun(some_class::some_member), то получаем функциональный объект, который принимает указатель (обычный!) на объект класса some_class и вызывает функцию some_member по этому указателю. Но что будет, если мы попытаемся вызвать operator() с аргументом – обобщенным указателем на объект класса A, если у этого указателя нет неявного преобразования в указатель на объект класса?

ПРИМЕЧАНИЕ Такие объекты-заместители бывают нужны, если клиенту нельзя давать доступ к самому объекту: например, если тот размещен в специальной области памяти и его адрес может меняться после сборки мусора.