c++

오늘 구현중 에러사항

이야기prog 2025. 4. 21. 21:01

template<typename T>

int Write(T* tmp) {return sizeof(T)} 할 시, tmp가 char[10] 타입이라면, sizeof(T)의 값은 char의 크기인 1일 것이고,

int Write(T& tmp) 라면 char[10] 크기 그 자체인 10이 된다. 배열이 함수의 매개변수로 입력되면 char[] -> char* 타입으로 캐스팅 되기 때문에 그런 것으로 보인다.

 

template<typename T>
bool Write(T& src) { return Write(reinterpret_cast<void*>(&src), sizeof(T)); } 

bool Write(void* src, uint32 len);

 

실제로 오늘 구현한 클래스 내부중 이러한 내용이 들어갔었는데, 처음에는

 


template<typename t>
bool Write(T* src) { return Write(src, sizeof(T)); }
bool Write(void* src, uint32 len);

 

이렇게 구현하였다가 sizeof(T)에 자꾸 1이 들어가길래 살펴보니 char타입의 크기였다.

 

또한 

template<typename T>
inline BufferWriter& BufferWriter::operator<<(T&& src) {
using DataType = std::remove_reference_t<T>; 
*reinterpret_cast<DataType*>(&_buffer[_pos]) = std::forward<DataType>(src);
_pos += sizeof(T);

return *this;
}

'abstract declarator': 참조에 대한 포인터를 만들 수 없습니다.

라는 에러가 뜨는데,

이 부분도 값을 BufferWriter란 함수내부에 buffer에 값을 복사하기 위해서 보편 참조형식으로 구현하였는데,

using DataType = std::remove_reference_t;  이 부분이 없이 그냥 *reinterpret_cast<T*>(&_buffer[_pos]) = std::forward<T>(src); 로 구현하면 일반참조가 T타입이라면 예를 들어서 const int& 타입이 T라면 *reinterpret_cast<const int&*> 타입이 되는건데, 참조의 포인터는 존재하지 않기 때문에 에러가 발생함. 그래서 레퍼런스를 삭제해주는 remove_reference_t로 참조를 제거하여서 사용하였다.

 

또한 UTF-16을 사용하기 위해서 wstring을 사용하였고, 멀티스레드 환경에서 에러사항이 있었는데,  
wcout.imbue(std::locale("kor"));

이 코드가 멀티스레드에서 실행되다보니 locale의 소멸자가 이중으로 발생하는 경우가 발생하였는데, 

static const std::locale koreanLoc("kor"); // new, delete 꼬임 방지
wcout.imbue(koreanLoc);
//wcout.imbue(std::locale("kor")); static으로 선언하여 해결하였다.

'c++' 카테고리의 다른 글

공부  (0) 2025.05.06
c++ 공부(algorithm)  (0) 2025.03.08
c++공부(list iterator 구현)  (0) 2025.03.07
c++ 공부(vector iterator 구현)  (0) 2025.03.06
c++ 공부  (1) 2025.03.03