2017-09-22 6 views
0

내 배경이 신속하고 객관적인 -C로되어 있으므로 작업중인 C++ 파일에서이 동작에 혼란스러워집니다. . 모든std :: atomic_fetch_add를 호출하는 중 ''atomic_fetch_add '호출에 대한 일치하는 함수가 없습니다.

첫째,이 라인은 :

'OSAtomicIncrement32Barrier' is deprecated: first deprecated in iOS 10.0 - Use std::atomic_fetch_add() from <atomic> instead

없음 땀 : 엑스 코드에서

OSAtomicIncrement32Barrier(&changeCounter); 

는 경고를 표시합니다. 나는 <atomic>을 가져으로 라인을 교체 :

std::atomic_fetch_add(&changeCounter, 1); 

하지만 지금은 완전한 오류 얻을 :

No matching function for call to 'atomic_fetch_add'

changeCounter 따라서 정의 : 나는 또한 시도했다

volatile int32_t changeCounter = 0; 

을 그것은 volatile int입니다. 그러나 변화는 없습니다.

코드 완성을 사용하여 해당 함수를 가져오고 올바른 인수를 넣을 수 있음을 알 수 있습니다. 설명서 (예 : here)는 사용중인 atomic_fetch_add을 보여 주며이를 수행하는 것으로 나타납니다 같은 방식으로.

이 문제를 해결하는 방법은 무엇입니까?

+0

'changeCounter'는'std :: atomic '이 필요합니다. http://en.cppreference.com/w/cpp/atomic/atomic_fetch_add 현재 C++에서'volatile'은 아무 관계가 없습니다. 멀티 스레딩. –

+0

@RichardCritten '원자 '유형을 확인해 볼게요. 이 파일은 원래 Apple에 의해 작성되었으므로, '휘발성 (volatile)'은 거기서부터 시작되었습니다. – ajbmdi

+0

@RichardCritten'changeCounter'를'std :: atomic '으로 바꿨습니다. 이제는 'std :: atomic '(일명 ''유형의 구성원 복사) 호출이 삭제되었습니다. 건설자" – ajbmdi

답변

0

RichardCritten 나를 올바른 길로 가라. 그러나 저쪽에 조금 더 가두어 야했다. 주요 솔루션은 내가

std::atomic<int32_t> changeCounter = {0}; 

주 주위 0 중괄호에

volatile int32_t changeCounter = 0; 

에서 changeCounter의 정의를 변경한다는 것입니다 : 그래서 그냥 0을 제공하여, std::atomic<int32_t>에 대한 복사 생성자가 없기 때문에이있다 오류

답변에 따르면 here, 중괄호로 할당하는 값을 배치하면 복사 생성자가 사용되지 않으므로 해당 문제가 해결됩니다.