ページ 11

operator new のオーバーロード

Posted: 2013年2月21日(木) 12:51
by tatra
operator new のオーバーロードについて質問があります

以下の様な引数のoperator newを定義してみたのですが
マルチバイト文字セットの時には問題なく動作するのに
UNICODEでこの関数を使おうとすると以下の様に引数型が違うと言われてしまうのですが
~~~~~
error C2665: 'operator new' : 6 オーバーロードのどれも、すべての引数の型を変換できませんでした
~~~~~

UNICODEコンパイルの時のoperator newに必要な引数はどのようになっているのでしょうか?

まだインターネットなどで調べている途中なのですがなかなか見つからないので
暇な時で良いので良ければみなさんの力をお貸しください

ちなみに環境は Visual Studio C++ 2008 でコンパイルしています
よろしくお願いします

コード:


//////////
//	: operator new のオーバーロード
void* operator new(size_t iSize, LPCTSTR sFile, LPCTSTR sFunc, UINT iLine){
	~~ 略 ~~
};

//////////
//	: operator delete のオーバーロード
void operator delete(void* pv){
	~~ 略 ~~
};
//////////
//	: 
#define new new(__FILE__, __FUNCTION__, __LINE__)

//////////
//	: メイン関数
int main(int argc, char* argv[])
{
	int* intPointer = new int ;
	delete intPointer ;
 	return 0;
}


Re: operator new のオーバーロード

Posted: 2013年2月21日(木) 13:08
by Blue
__FILE__はconst char*の値を返すようです。

UNICODEでビルドするときは LPCTSTR はconst wchar_t* となるので型が不一致になるのでしょう。
関数の中で LPCTSTR に変換するように変えてみては。

コード:

void* operator new(size_t iSize, LPCSTR sFile, LPCSTR sFunc, UINT iLine){
    ~~ 略 ~~
};

Re: operator new のオーバーロード

Posted: 2013年2月21日(木) 13:18
by tatra
なるほど…
参考にしていたコードが LPCTSTRとなっていたので LPCTSTRを返すと思っていました

ありがとうございました!

Re: operator new のオーバーロード

Posted: 2013年2月21日(木) 13:30
by hoge
もう解決したみたいだけど
#define new new(_T(__FILE__), _T(__FUNCTION__), __LINE__)
でいけるはず。

Re: operator new のオーバーロード

Posted: 2013年2月21日(木) 13:41
by Blue
__FILE__はconst char* じゃなくて文字列リテラルを返すんですね。
間違ってました。

えぴさんの
http://blogs.wankuma.com/episteme/archi ... 41624.aspx
も参考にしてみては。