static_assert failed: 'atomic<T> requires T to be trivially copyable, copy constructible, move constructible, copy assignable, and move assignable.

강병우·2024년 2월 12일

📖 Description

스마트포인터 형태의 Player와 Room을 원자성을 부여하면 다음과 같은 에러가 발생합니다.

심각도	코드	설명	프로젝트	파일	줄	비표시 오류(Suppression) 상태
오류	C2338	static_assert failed: 'atomic<T> requires T to be trivially copyable, copy constructible, move constructible, copy assignable, and move assignable.'	BWServer	C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\atomic	2172	

문제가 발생하는 코드는 다음과 같습니다.

GameSession.h

atomic<boost::shared_ptr<Player>> player;

Object.h

atomic<boost::weak_ptr<Room>> room;

🔧해결완료

원인 : 해당 기능은 C++ 20부터 지원됩니다.

참조카운터는 원자성이 보존되지만, 데이터는 그렇지 않습니다. 이를 atomic으로 씌워야하는데, C++ 20 이상부터만 지원합니다.
단, memory 헤더를 참조해야 합니다.

참고링크
또한, 위 방법은 표준형 스마트포인터만 지원하기 때문에 boost를 사용할 수 없습니다..

해결방법
프로젝트 -> 프로젝트 속성을 클릭하고 아래 사진처럼 옵션으로 들어갑니다.

image

C++ 20 버전으로 올린다음, memory 헤더를 참조합니다.
소스코드도 표준형으로 수정해줍니다.

GameSession.h

private:
	atomic<std::shared_ptr<Player>> player;

Object.h

public:
	atomic<std::weak_ptr<Room>> room;

0개의 댓글