2016-12-14 5 views
1

Я просто попытался использовать новый оператор размещения, предложенный Скоттом Мейерсом в «Effectice C++ во встроенной среде».Размещение новое для абстракции регистра MCU, предложенное Meyers

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 - это операторская функция. Ваш конкретный один должен быть определен как

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

в файле заголовка <new>.

Использование #include <new> должно решить вашу проблему.

Для примера смотрите здесь: https://godbolt.org/g/iKatox

Более подробную информацию о новых операторов можно найти здесь: http://en.cppreference.com/w/cpp/memory/new/operator_new


Update:

Если у вас нет доступа к вы можете определить его самостоятельно. я использовал VC++ 14 версии в качестве шаблона для этого:

#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

О, стыд на меня!!! Благодаря! – wimalopaan

+0

Ну, что мне делать, если у меня нет файла с добавлением , как в случае с avr-g ++? – wimalopaan

+0

@wimalopaan Я обновил свой ответ ... –

 Смежные вопросы

  • Нет связанных вопросов^_^