ページ 11

C++

Posted: 2009年1月07日(水) 13:22
by ざこ
今までC言語ばかり勉強してきましたがC++も勉強しようと一番簡単な所から始めたのですが何故かエラーになります。
#include <iostream>
#include <string>
using namespace std;

class Neko
{
private:
    string name;
public:
    Neko(string s){
        name = s;
    }
    void naku(){
        cout<<"にゃあ。俺様は"<<name<<"だ。"<<endl;
    }
};

int main()
{
    Neko dora("ボス");  //「ボス」というの名前を持ったdoraが生成される
    cout<<"あなたの名づけた猫がメモリ上に生成されました。"<<endl;
    cout<<"猫が鳴きます。"<<endl;

    dora.naku();
}
エラーは  cout<<"にゃあ。俺様は"<<name<<"だ。"<<endl;の所で 
fatal errorC2679 二項演算子 '<<' class std::basic string<char,struct std::char_traits<char>,class std::allocator<char> です。
name の所が悪いっぽいんですが原因がわかりません。
似たような構文使ってもこんなエラーはでませんでした。原因と対策を教えて下さい。
VC++6.0のコンソールアプリケーションを使ってます。

Re:C++

Posted: 2009年1月07日(水) 13:31
by バグ
同じ環境(VC++6.0)で同じソース(コピペしただけ)で実行してみましたが、エラーは出ませんよ?
なんというエラーが出ていますか?(mainの戻り値がないのは、とりあえず無視しましたが…)

Re:C++

Posted: 2009年1月07日(水) 13:32
by ざこ
質問の方にエラー内容書き加えました。

Re:C++

Posted: 2009年1月07日(水) 13:44
by バグ
試しに、Nekoクラスを下記のように変更してみてもらえますか?
class Neko
{
private:
	string name;

public:
	Neko(string s)
	{
		name = s;
	}

	Neko(char* s)
	{
		name = s;
	}

	void naku()
	{
		cout << "にゃあ。俺様は " << name << "だ。" << endl;
	}
};

Re:C++

Posted: 2009年1月07日(水) 13:48
by ざこ
同じ結果になりました。

Re:C++

Posted: 2009年1月07日(水) 13:48
by バグ
あ、ごめんなさい、上の書き込みは勘違いです。気にしないでくださいm(__)m

Re:C++

Posted: 2009年1月07日(水) 13:59
by バグ
Nekoクラスのメンバ関数のnakuを下記のように書き換えてみてください。
これだと、どこでエラーが出ますか?
void naku()
{
	cout << "にゃあ。俺様は ";
	cout << name;
	cout << "だ。";
	cout << end;
}

Re:C++

Posted: 2009年1月07日(水) 14:02
by ざこ
cout << name; の部分で同じエラー内容です。

Re:C++

Posted: 2009年1月07日(水) 14:03
by バグ
うわ、間違ってた…(^_^;)

cout << endl;

ですね。一文字抜けてましたm(_ _)m

Re:C++

Posted: 2009年1月07日(水) 14:14
by バグ
ということは、std::coutでオーバーロードされている<<演算子に、std::stringを表示するためのものが用意されていないって事かな?下記ならどうですか?多分、これでいけると思うんだけど…
void naku()
{
	cout << "にゃあ。俺様は ";
	cout << name.c_str();
	cout << "だ。";
	cout << endl;
}

Re:C++

Posted: 2009年1月07日(水) 14:18
by ざこ
おおいけました。お手数ですがname.c_str();というのがどこから出てきたのか教えて下さい。

Re:C++

Posted: 2009年1月07日(水) 14:32
by バグ
このサンプルソースのNekoクラスの中にnakuというメンバ関数があるように、std::stringクラスにもメンバ関数が存在します。

c_strというメンバ関数は、std::stringの中の文字列の終端に'\0'を足した、編集不可能な文字列へのポインタを返します。

つまり、今回のようにstd::stringクラスのままでは駄目だけれど、const char*のような型であれば問題ない場合にc_strを使って従来の(C言語の際に使用していたような)文字列と同じような物に変換やればいいわけです。

しかし、同じVC++6.0で動作が違うのは気になりますね。ひょっとしたら、サービスパックが入ってない(もしくは最新ではない)のかもしれませんね。

Re:C++

Posted: 2009年1月07日(水) 15:45
by dic
私もVC++6.0 使ってみましたがエラーは発生しませんでしたね
インストールに失敗しているのではないでしょうか?

Re:C++

Posted: 2009年1月07日(水) 17:22
by ざこ
ありがとうございました。