Я работаю в Swift и Objective-C, поэтому меня смущает это поведение в файле C ++, над которым я работаю.
Прежде всего, эта строка:
OSAtomicIncrement32Barrier(&changeCounter);
В XCode это показывает предупреждение:
«OSAtomicIncrement32Barrier» устарел: первый устарел в iOS 10.0 — используйте std :: atomic_fetch_add () из <атомное> вместо
Нет пота. Я импортирую <atomic>
и заменить строку на:
std::atomic_fetch_add(&changeCounter, 1);
Но теперь я получаю полную ошибку:
Нет подходящей функции для вызова atomic_fetch_add
changeCounter
определяется так:
volatile int32_t changeCounter = 0;
Я также попробовал это как volatile int
, Но без изменений.
Я использовал завершение кода, чтобы получить эту функцию, и, насколько я могу судить, я ввожу правильные аргументы. Документация, которую я могу найти (например, Вот) показывает atomic_fetch_add
в использовании, и я, кажется, делаю это так же.
Есть идеи, как решить эту проблему?
RichardCritten поставил меня на правильный путь, но это потребовало немного больше усилий. Основным решением является то, что я изменил определение changeCounter
от
volatile int32_t changeCounter = 0;
в
std::atomic<int32_t> changeCounter = {0};
Обратите внимание на фигурные скобки вокруг 0
: это потому, что нет конструктора копирования для std::atomic<int32_t>
так что используя только 0
выдает ошибку
Копирование подобъекта члена типа ‘std :: atomic’ (он же ‘atomic’) вызывает удаленный конструктор
Согласно ответу Вот, размещение значения для присвоения в фигурных скобках позволяет избежать использования конструктора копирования, что устраняет эту проблему.
Других решений пока нет …