C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: 暗黙のキャストについて


(過去ログ 59 を表示中)

[トピック内 11 記事 (1 - 11 表示)]  << 0 >>

■33699 / inTopicNo.1)  暗黙のキャストについて
  
□投稿者/ 七篠 (28回)-(2009/03/07(Sat) 15:47:04)

分類:[C/C++] 

こんにちは。

STLのwstringをラップして文字列クラスを作っているのですが問題が発生しました。
wchar型のポインタが要求されたときに暗黙で処理できるように

operator const wchar_t*();

といオーバーライドをしたのですが

String str = L"hoge";
wcout << str << endl;

といった記述をしたときの出力結果が文字列でなく16進数になってしまいます。
しかし以下のような関数を通すと文字が描画されます。

const wchar_t* Print(ref_String str)
{
	return str;
}

原因や解決法をご存知の方、アドバイスいただけると幸いです。

〜以下テスト用ソースです〜

#include <iostream>
#include <string>
using namespace std;

class String
{
public:
	wstring	_string;
public:
	String(const wchar_t* pStr)
	{
		_string	= pStr;
	}

	operator const wchar_t*()
	{
		return _string.c_str();
	}
};

const wchar_t* Print(const String& str)
{
	// String を別ファイルで定義していると問題なくビルドが通ったのですが、
	// 一緒くたにしたらはじかれたので _string を public にしています。
	return str._string.c_str();
}

void main()
{
	String str = L"hoge";

	wcout << str << endl;
	wcout << Print(str) << endl;
}

引用返信 編集キー/
■33702 / inTopicNo.2)  Re[1]: 暗黙のキャストについて
□投稿者/ επιστημη (1801回)-(2009/03/07(Sat) 19:20:55)
επιστημη さんの Web サイト
2009/03/07(Sat) 19:45:42 編集(投稿者)
> wchar型のポインタが要求されたときに暗黙で処理できるように

要求されていないんじゃないすか?

↓これだとちゃんと動くから。

#include <iostream>
#include <string>
using namespace std;

class String {
  wstring _string;
public:
  String(const wchar_t* pStr) : _string(pStr) {}
  operator const wchar_t*() { return _string.c_str(); }
  friend const wchar_t* Print(const String&);
};

const wchar_t* Print(const String& str) {
  return str._string.c_str();
}

int main() {
  String str = L"hoge";
  wcout << static_cast<const wchar_t*>(str) << endl; // 明示的にキャストする
  wcout << Print(str) << endl;
}

引用返信 編集キー/
■33703 / inTopicNo.3)  Re[1]: 暗黙のキャストについて
□投稿者/ επιστημη (1802回)-(2009/03/07(Sat) 19:34:06)
επιστημη さんの Web サイト
> 原因や解決法をご存知の方、アドバイスいただけると幸いです。

僕なら暗黙のキャストに頼らず、wostream に << できるようにします。

引用返信 編集キー/
■33706 / inTopicNo.4)  Re[2]: 暗黙のキャストについて
□投稿者/ 774RR (319回)-(2009/03/07(Sat) 20:44:40)
とりあえず何がおきているか、だけ解析するなら
const void* ← const wchar_t * の暗黙変換を経由して operator <<(const void*) が呼ばれている。

解決法はやはりきっちり出力演算子を作る、のだろうな。
wostream に出力できるようにするのもいいけど
wchar_t にこだわらず basic_ostream に出力できるようにするほうがいいかもしれない。
引用返信 編集キー/
■33714 / inTopicNo.5)  Re[2]: 暗黙のキャストについて
□投稿者/ 七篠 (30回)-(2009/03/07(Sat) 22:53:17)
No33703 (επιστημη さん) に返信
なるほど、確かにPrint関数では明らかに "const wchar_t" が要求されていますね。

wcout << str << endl;

の方はオーバーライドしたオペレータは呼ばれていますが、
short型などと解釈されていたのかもしれませんね。

ありがとうございました!
解決済み
引用返信 編集キー/
■33715 / inTopicNo.6)  Re[3]: 暗黙のキャストについて
□投稿者/ 七篠 (31回)-(2009/03/07(Sat) 22:58:03)
No33706 (774RR さん) に返信
> 解決法はやはりきっちり出力演算子を作る、のだろうな。
> wostream に出力できるようにするのもいいけど
> wchar_t にこだわらず basic_ostream に出力できるようにするほうがいいかもしれない。

Stringクラスで "<<" 演算子を実装するということでしょうか?
STLは深く理解せずに使っているところがあるので、今後さらに勉強してみようと思います。
ありがとうございました!
解決済み
引用返信 編集キー/
■33716 / inTopicNo.7)  Re[4]: 暗黙のキャストについて
□投稿者/ επιστημη (1805回)-(2009/03/07(Sat) 23:14:38)
επιστημη さんの Web サイト
> Stringクラスで "<<" 演算子を実装するということでしょうか?

#include <iostream>
#include <string>

class String {
  std::wstring _string;
public:
  String(const wchar_t* pStr) : _string(pStr) {}
  friend std::wostream& operator<<(std::wostream& stream, const String& s);
};

std::wostream& operator<<(std::wostream& stream, const String& s) {
  return stream << s._string;
}

int main() {
  String str = L"hoge";
  std::wcout << str << std::endl;
}

解決済み
引用返信 編集キー/
■34167 / inTopicNo.8)  Re[5]: 暗黙のキャストについて
□投稿者/ 七篠 (32回)-(2009/03/21(Sat) 02:05:22)
No33716 (επιστημη さん) に返信

返信送れてすみません(解決したので気づきませんでした;)
具体的なソースありがとうございます!
引用返信 編集キー/
■34174 / inTopicNo.9)  Re[6]: 暗黙のキャストについて
□投稿者/ アキラ (168回)-(2009/03/21(Sat) 11:29:09)
アキラ さんの Web サイト
No34167 (七篠 さん) に返信

これがはじかれるって話ですが

const wchar_t* Print(const String& str)
{
    return str;                 // エラー!
    return str._string.c_str(); // OK
}


これがconstメンバ関数じゃないからですよ。

operator const wchar_t*()

なので、

operator const wchar_t*() const

にすればいけます

const wchar_t* Print(const String& str)
{
    return str; // OK
}

引用返信 編集キー/
■34175 / inTopicNo.10)  Re[7]: 暗黙のキャストについて
□投稿者/ アキラ (169回)-(2009/03/21(Sat) 11:35:32)
アキラ さんの Web サイト
ついでに、オーバーライドじゃなくてオーバーロードでっす
引用返信 編集キー/
■34176 / inTopicNo.11)  Re[8]: 暗黙のキャストについて
□投稿者/ 七篠 (35回)-(2009/03/21(Sat) 15:19:06)
No34175 (アキラ さん) に返信

お返事ありがとうございます。

> これがconstメンバ関数じゃないからですよ。
なるほど、そうゆうことだったんですね。

> ついでに、オーバーライドじゃなくてオーバーロードでっす
ご指摘ありがとうございます。これは恥ずかしい間違いですね^^;
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -