2016-12-14 6 views
1

「埋め込み環境でのEffectice C++」のScott Meyersの提案にしたがって、プレースメントnew演算子を使用しようとしました。Meyersが提案したMCUレジスタ抽象化の新機能

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

は、その後、私はfollwoingエラーを取得:

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


アップデート:

あなたがアクセス権を持っていない場合あなた自身で定義するかもしれません。 私は、このためのテンプレートとして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私の答えを更新しました... –

関連する問題