스마트포인터 형태의 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를 사용할 수 없습니다..
해결방법
프로젝트 -> 프로젝트 속성을 클릭하고 아래 사진처럼 옵션으로 들어갑니다.
C++ 20 버전으로 올린다음, memory 헤더를 참조합니다.
소스코드도 표준형으로 수정해줍니다.
GameSession.h
private:
atomic<std::shared_ptr<Player>> player;
Object.h
public:
atomic<std::weak_ptr<Room>> room;