#c #function-pointers #this-pointer
#c #функции-указатели #this-указатель
Вопрос:
У меня есть typedef для указателя на функцию:
typedef bool(WlanApiWrapper::* (connect_func) )(WLAN_AVAILABLE_NETWORK, const char *, const char *);
и есть метод, который возвращает указатель на функцию:
const auto connect_method = map_algorithm_to_method(*network)
Итак, я хочу назвать это так:
(*this.*connect_method)(*network, ssid, pass);
но выдает ошибку:
Error (active) E0315 the object has type qualifiers that are not compatible with the member function CppWlanHack C:ProjectsCppWlanHackCppWlanHackWlanApiWrapper.cpp 52
но когда я вызываю это так:
WlanApiWrapper f;
(f.*connect_method)(*network, ssid, pass);
все строится…
Как я могу вызвать метод без создания объекта, потому что у меня уже был объект (этот указатель)
Комментарии:
1. Вы, случайно, не пытались сделать то, что пытаетесь сделать, в методе const? Обратите внимание, что ваш
connect_func
тип является указателем на неконстантную функцию-член…2. Когда люди просят вас опубликовать воспроизводимый пример, сделайте это вместо удаления вашего вопроса. Вы можете анализировать числа, разделенные пробелами
long.Parse("3 567",NumberStyles.Number, new NumberFormatInfo{NumberGroupSeparator=" "})
. Разделитель может не быть фактическим пробелом, хотя это может быть неразрывный пробел или что-то подобное
Ответ №1:
Сообщение об ошибке звучит для меня так, как будто вы вызываете неконстантный указатель на функцию-член внутри постоянной функции-члена. this
является ли a внутри постоянной функции-члена так. const WlanApiWrapper *
the object (*this) has type qualifiers (const) that are not compatible with the (non-const) member function
Чтобы решить эту проблему, вы можете либо создать connect_method
const, либо создать функцию-член, содержащую (this->*connect_method)(*network, ssid, pass);
неконстантную.
Комментарии:
1. Для полноты картины можно добавить, что либо функция-член, содержащая вызов через указатель функции-члена, должна быть сделана неконстантной, либо указатель функции-члена должен указывать на постоянную функцию-член. В свете того, что
connect_func
следует из названия, последнее, скорее всего, не будет работать в рассматриваемом случае…
Ответ №2:
Назовите это так:
((*this).*connect_method)(*network, ssid, pass);
Это должно работать со всеми компиляторами.
Для получения дополнительной информации прочитайте, как я могу избежать синтаксических ошибок при вызове функции-члена с использованием функции-указателя на функцию-член?в C FAQ
Комментарии:
1. Унарный
*
оператор имеет более высокий приоритет, чем.*
оператор, так что здесь это не должно быть проблемой. Я согласен, однако, что использование дополнительных круглых скобок сделало бы все это немного более приятным для глаз…2. Почему бы не использовать
this->*connect_method
вместо этого?