2016-12-14 5 views
1

"임베디드 환경의 Effectice C++"에서 Scott Meyers가 제안한대로 새로운 연산자를 사용하려고했습니다.마이어스가 제안한 MCU 레지스터 추상화의 새로운 기능

DefaultMcuType::PortRegister* p = new(reinterpret_cast<void*>(0x05)) DefaultMcuType::PortRegister; 

는 다음 나는 때라도 오류를 얻을 :

register.cc: In function 'int main()': 
register.cc:30:90: error: no matching function for call to 'operator  new(sizetype, void*)' 
DefaultMcuType::PortRegister* p = new(reinterpret_cast<void*>(0x05)) DefaultMcuType::PortRegister; 
                         ^~~~~~~~~~~~ 
<built-in>: note: candidate: void* operator new(unsigned int) 
<built-in>: note: candidate expects 1 argument, 2 provided 
<built-in>: note: candidate: void* operator new(unsigned int, std::align_val_t) 
<built-in>: note: no known conversion for argument 2 from 'void*' to 'std::align_val_t' 
register.cc:30:35: warning: unused variable 'p' [-Wunused-variable] 
DefaultMcuType::PortRegister* p = new(reinterpret_cast<void*>(0x05)) DefaultMcuType::PortRegister; 
          ^

정말 내가 뭘 잘못 알아낼 수 없습니다.

+0

당신은 누락을'#INCLUDE ' – Mine

답변

4

게재 위치 new는 연산자 기능입니다. 특정 하나의 헤더 파일 <new>에서

void* operator new (std::size_t count, void* ptr);

을 정의해야합니다.

#include <new>을 사용하면 문제가 해결됩니다. 예를 들어

는 여기를 참조하십시오 https://godbolt.org/g/iKatox

새로운 연산자에 대한

자세한 정보는 여기에서 찾을 수 있습니다 : http://en.cppreference.com/w/cpp/memory/new/operator_new


업데이트 :

당신이 액세스 할 수없는 경우 새로운 배치 당신은 너 자신 그것을 정의 할지도 모르다.

#include <stdlib.h> //for std::size_t 
inline void* operator new(std::size_t size, void* ptr) 
{ 
    (void)size;//unused 
    return ptr; 
} 

inline void operator delete(void*, void*) 
{ 
    return; 
} 

당신은 동일한 어셈블리 코드를 생성하는 두 버전을 비교할 수 있습니다 : https://godbolt.org/g/6UjER9

+0

아, 수치 나는 이것에 대한 템플릿으로 VC++ 14 버전을 사용 나에게! 감사! – wimalopaan

+0

avr-g ++의 경우와 마찬가지로 포함 파일이 없으면 어떻게해야합니까? – wimalopaan

+0

@wimalopaan 답변을 업데이트했습니다 ... –