Условный оператор не может разрешить перегруженные указатели функции членства

В 64-разрядных системах x64 ключ:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

Большинство программ перечислено там. Посмотрите на ключи: DisplayName DisplayVersion

Примечание, что последнее не всегда устанавливается!

В 64-разрядных системах x86 ключ (обычно с большим количеством записей):

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
5
задан Daniel Daranas 27 June 2013 в 13:27
поделиться

3 ответа

Из раздела 13.4 / 1 («Адрес перегруженная функция, "[over.over]):

Использование имени перегруженной функции без аргументов разрешается в определенных контекстах функции, указатель на функцию или указатель на функцию-член для конкретной функции из набора перегрузки. Имя шаблона функции считается именем набора перегруженных функций в таких контекстах. Выбранная функция - это та, тип которой соответствует целевому типу, требуемому в контексте. Целью может быть

  • инициализируемый объект или ссылка (8.5, 8.5.3),
  • левая часть назначения (5.17),
  • параметр функции (5.2.2),
  • ] параметр определяемого пользователем оператора (13.5),
  • возвращаемое значение функции, операторной функции или преобразования (6.6.3) или
  • явное преобразование типа (5.2.3, 5.2.9 , 5.4).

Перед именем функции перегрузки может стоять оператор & . Имя перегруженной функции не должно использоваться без аргументов в контекстах, отличных от перечисленных. [ Примечание: Любой избыточный набор скобок, окружающий имя перегруженной функции, игнорируется (5.1). ]

Цель , которая, как вы надеялись, будет выбрана из приведенного выше списка, была первой, инициализируемый объект. Но на пути есть условный оператор, и условные операторы определяют свои типы по своим операндам, а не по какому-либо целевому типу.

Поскольку явные преобразования типов включены в список целей, вы можете приводить к типу каждое выражение указателя-члена в условном выражении отдельно. Сначала я бы сделал typedef:

typedef void (Foo::* float_func)(const float);
float_func func = (someCondition ? float_func(&Foo::X) : float_func(&Foo::Y));
7
ответ дан 14 December 2019 в 01:12
поделиться

Пример:

class Foo {
public:
    void X(float x) {}
    void Y(float y)  {}
    float X() const;
};
typedef void (Foo::*Fff)(float);
Fff func = &Foo::X;
Fff func2 = true ? (Fff)&Foo::X : (Fff)&Foo::Y;

int main(){
    return 0;
}

Вам необходимо немедленно привести & Foo :: X, чтобы устранить перегрузку. Обратите внимание: если вы закомментируете перегруженный float X (), вам не нужно этого делать.

Похоже, компилятор недостаточно умен, чтобы вывести требуемый тип возвращаемого значения троичного выражения (это может быть ошибка).

1
ответ дан 14 December 2019 в 01:12
поделиться

Вам действительно нужно использовать DTO? У вас не было бы этой проблемы, если бы вы передавали реальную сущность, и вам не пришлось бы загружать сущность снова, что не совсем хорошо для производительности.

Но даже если у вас есть законная причина для использования DTO, я не совсем понимаю, почему вы пытаетесь обновить номер версии на своем только что перезагруженном объекте перед сохранением. Рассмотрим различные сценарии, возможные в вашем рабочем процессе:

  1. Сущность загружается изначально, имеет версию = V1
  2. Она передается в DTO, которая переходит в пользовательский интерфейс, возвращается и готова к сохранению.
  3. Сущность загружается снова, имеет version = V2

Теперь у вас есть две возможности:

  1. V1 == V2. Пичи, тебе не нужно ничего делать.
  2. V1 меньше, чем V2, это означает, что объект был обновлен кем-то другим, пока вы его редактировали. Нет причин пытаться установить версию V1 и пытаться сохранить, потому что сохранение не удастся. Вы можете либо сохранить его с помощью V2 (таким образом, переопределив чужие изменения), либо потерпеть неудачу сейчас (без использования Hibernate). В этой ситуации он не может определить тип результата, потому что типы ввода имеют несколько вариантов. Только когда будет определен тип троичного оператора, он попытается выполнить присваивание.

1
ответ дан 14 December 2019 в 01:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: