UTF-16文字列を扱うためのostreamを用意したいのですが、wcoutの代わりに、unsigned shortを用いたostreamを使いたいと思いました。
そこで、basic_ostreamのクラスのunsigned short型のインスタンスを作ったのですが、以下のエラーが出てしまってコンパイルが出来ませんでした。
「error C2296: '<<' : 無効です。左オペランドには型 'u16ostream (__cde
cl *)(void)' が指定されています。」
「error C2297: '<<' : 無効です。右オペランドには型 'u16char *' が指定
されています。」
コンパイラはVC++2008です。
それとついでですが、通常通りwcoutを使う時みたいに、localeを設定する必要はあるのでしょうか?
回答、よろしくお願いします。
/* 以下ソースコード */
#include <iostream>
typedef unsigned short u16char;
typedef basic_ostream<u16char> u16ostream;
int main()
{
u16ostream ucout();
u16char* str = (u16char*)(L"ああ");
ucout << str << '\n';
return 0;
}
No.5ベストアンサー
- 回答日時:
こんばんは。
取りあえず、std::wcout等が書かれたヘッダの中を検索して、見よう見まねでコンパイルには通りました。
当方はVisualStudio 2008 SP1です。
まあ、表示がおかしいのですが(typedef wchar_t u16char にすれば普通に表示されます)、以下参考程度に。
#include<iostream>
#include<fstream>
//#include<yvals.h>
#define _cpp_stdout (&(__iob_func())[1])
typedef unsigned short u16char;
typedef std::basic_filebuf<u16char, std::char_traits<u16char> > u16filebuf;
typedef std::basic_ostream<u16char, std::char_traits<u16char> > u16ostream;
int main()
{
u16filebuf ufb(_cpp_stdout);
u16ostream ucout(&ufb);
std::locale::global(std::locale(""));
ucout.imbue(std::locale(""));
ucout << L"ああ";
return 0;
}
回答ありがとうございます。
ただ、yvals.hというヘッダを今改めて探してみた限りでは、該当部分の記述がなぜか見つからなかったですね。ネット上のヘッダのテキストからは見つかりましたが。
とりあえずここからなんとかできるか試してみます。ありがとうございました。
No.3
- 回答日時:
すみません, #1 は (微妙に関係する可能性はあるかもしれないけど) 的を外してますね. #2 がただしい.
んで, デフォルトコンストラクタに template をつけてどうするの?
この回答への補足
再びの回答ありがとうございます。というより、先程の回答の際には何も言わずすみませんでした。
本題ですが、正直、意味も分かっておらずにtemplate付けていました。
しかし、外しても下のエラーが出ますね。
error C2248: 'std::basic_streambuf<_Elem,_Traits>::basic_streambuf' : protected メンバ (クラス 'std::basic_streambuf<_Elem,_Traits>' で宣言されている) にアクセスできません。
また、他にも調べてみたのですが、どうやらbasic_streambufを継承して改良しなければダメなのでしょうか。
coutとかwcoutなどの場合、どういうパラメータを与えてインスタンスを作成してるんでしょうね。標準出力ストリームの機能拡張がしたいわけではないのに……。
No.2
- 回答日時:
エラーメッセージをよく見ればわかると思いますが...
> u16ostream ucout();
この部分は関数の宣言ですね。
(u16ostream型の返却値を返すucout関数の)
u16ostream型のオブジェクトを作りたいのであれば、
u16ostream ucout;
と書くべきです。
この回答への補足
回答ありがとうございます。
「u16ostream ucout;」としてみましたが、やはりダメです。
「http://sato-si.at.webry.info/200502/article_6.html」を参考にして下のようにいじってみましたが、「C2512:既定のコンストラクタが存在しません」と出てしまいますね。
template<class C = u16char, class T = char_traits<u16char> >
class u16ostream : public std::basic_ostream<C, T>{
public:
/* コンストラクタ */
template<class charT, class traits >
explicit u16ostream() : std::basic_ostream<C,T>(new basic_streambuf<C, T>) {}
/* デストラクタ */
virtual ~u16ostream() {}
friend u16ostream& operator<< (u16ostream& stream, const u16char* s);
};
template<class C, class T>
u16ostream<C, T>& operator<< (u16ostream<C,T>& stream, const u16char* s)
{
stream << s;
return stream;
}
No.1
- 回答日時:
そもそも
「u16ostream を左オペランド, u16char* を右オペランドにとる opeartor<<」
は宣言してあるのですか?
この回答への補足
やっぱり"<<"演算子のオーバーロードが必要なのですか…。
そう思ってu16ostreamを以下のようにもしてみたのですが、エラーは変わらなかったです。
class u16ostream : public std::basic_ostream<u16char>{
public:
friend u16ostream& operator<< (u16ostream& stream, const u16char* s);
};
u16ostream& operator<< (u16ostream& stream, const u16char* s)
{
stream << s;
return stream;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# ある線が円の範囲に入っているかの計算 1 2022/12/07 16:14
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- Visual Basic(VBA) エクセルVBA 3 2022/06/23 20:00
- 数学 (4)のim(T)をu1,u2,u3の線型結合で表せ、という問題がわからないです。回答を見ると私の解 2 2023/05/31 22:14
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- PowerPoint(パワーポイント) エクセルのマクロについて教えてください。 2 2022/11/18 15:34
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- Excel(エクセル) EXCELの複数条件検索 1 2022/05/09 22:46
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
switch文のエラーについて
-
セグメンテーションフォルトが...
-
ファイル読み込みとmap処理
-
構文エラーが出ているのですが...
-
リモートデスクトップの接続元I...
-
iostream インクルード時に発生...
-
C++で縦の棒グラフ
-
snprintfが使用できない。
-
VC++で文字列から任意の文字を...
-
std::map の const 修飾について
-
このプログラミング誰か教えて...
-
vectorの中にmap
-
std::wstringのメモリリークに...
-
ヘッダーファイルがインクルー...
-
string型のフォーマット書式指...
-
winpcapを用いたプログラミング
-
C++で大量のエラーが出る
-
コンパイルできません
-
C++ basic_ostreamの拡張
-
atlbase.h と afxwin.hの同時定義
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構文エラーが出ているのですが...
-
VC++で文字列から任意の文字を...
-
enumの値から定義名を文字列化...
-
switch文のエラーについて
-
空ENTERの判別
-
なぜ、C++の標準ヘッダをインク...
-
【C++】ヘッダ内でstringを格納...
-
C++での <iostream.h>と<iostre...
-
#include "fstream.h"
-
#define中の#のエスケープ
-
JPEGやPNGが読めるLoadImage関数
-
リモートデスクトップの接続元I...
-
CStringとString
-
string型のフォーマット書式指...
-
std::map の const 修飾について
-
VHDLのsignedとunsignedの違いは?
-
このプログラミング誰か教えて...
-
構造体配列のvectorへの変換と...
-
指定した文字を削除したい
-
構造体に決められた文字列を入...
おすすめ情報