ページ 1 / 1
キャスト演算子をオーバーロードしたい
Posted: 2011年11月20日(日) 02:57
by MoNoQLoREATOR
ostringstreamクラスで<<演算子を使用したときに自動的にconst char*型を返してくれると便利なので、
a5uaさんのコードを見ながら下記のコードを書いてみたのですが、コンパイルエラーが出てしまいました。
↓ソースコード
► スポイラーを表示
コード:
class cnct{
ostringstream mystr;
public:
template <typename X>
cnct & operator << (const X &x){
mystr << x;
return *this;
}
operator const char * () const{ return mystr.str().c_str(); }
};
エラー内容
コード:
error C2801: 'operator const char *' は静的でないメンバでなければなりません
ちなみにVisualC++2008を使用しています。
ご教授よろしくお願い致します。
Re: キャスト演算子をオーバーロードしたい
Posted: 2011年11月20日(日) 06:44
by beatle
本当にそこソースコードでそのエラーが出ますか?僕は出ませんでした。Visual C++ 2010です。
ちなみにそのソースコードだと、operator const char*の戻り値はダングリングポインタになります。
うまく動くまでに改造してみました。
► スポイラーを表示
コード:
#include <sstream>
#include <string>
#include <iostream>
class cnct{
std::ostringstream mystr;
mutable std::string str_;
public:
template <typename X>
cnct & operator << (const X &x){
mystr << x;
return *this;
}
operator const char * () const { str_ = mystr.str(); return str_.c_str(); }
};
int main()
{
cnct c;
std::cout << (const char*)(c << "hello, " << "world!") << std::endl;
}
Re: キャスト演算子をオーバーロードしたい
Posted: 2011年11月20日(日) 14:51
by a5ua
VC2008 Expressをインストールして試してみましたが、コンパイルエラーは出ませんでした。
(バージョン情報)
Microsoft Visual Studio 2008
Version 9.0.30729.1 SP
MoNoQLoREATORさんが使用しているVCのバージョンはいくつですか?
Re: キャスト演算子をオーバーロードしたい
Posted: 2011年11月20日(日) 16:13
by MoNoQLoREATOR
>>beatleさん
そうでしたか。ありがとうございます。
>>a5uaさん
同じく
Version 9.0.30729.1 SP
でした。とりあえずインストールし直してみようと思います。
Re: キャスト演算子をオーバーロードしたい
Posted: 2011年11月20日(日) 16:29
by beatle
コード:
error C2801: 'operator const char *' は静的でないメンバでなければなりません
というエラーはおかしいんですよね。operator const char *はどうみても普通のメンバですから。
間違ったファイルをコンパイルしようとしているのではないかと思うんですが。
再インストール云々で治る話ではないと思います。
Re: キャスト演算子をオーバーロードしたい
Posted: 2011年11月20日(日) 20:30
by MoNoQLoREATOR
新しいプロジェクトを作成し、ついでにソースコードを下記のようにセキュアにするとコンパイルが通りました。
► スポイラーを表示
コード:
#include <sstream>
#include <string>
using namespace std;
class cnct{
ostringstream myoss;
mutable string mystr;
public:
template <typename X>
cnct & operator << (const X &x){
myoss << x;
return *this;
}
operator const char * () const{
mystr = myoss.str();
return mystr.c_str();
}
};
int main(){}
原因がどうであれ、解決したので良かったです。
ダングリングポインタを返していることも、その対処法も教えていただけて幸運だったと思います。
ありがとうございました。