C++

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ざこ

C++

#1

投稿記事 by ざこ » 16年前

今まで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++

#2

投稿記事 by バグ » 16年前

同じ環境(VC++6.0)で同じソース(コピペしただけ)で実行してみましたが、エラーは出ませんよ?
なんというエラーが出ていますか?(mainの戻り値がないのは、とりあえず無視しましたが…)

ざこ

Re:C++

#3

投稿記事 by ざこ » 16年前

質問の方にエラー内容書き加えました。

バグ

Re:C++

#4

投稿記事 by バグ » 16年前

試しに、Nekoクラスを下記のように変更してみてもらえますか?
class Neko
{
private:
	string name;

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

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

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

ざこ

Re:C++

#5

投稿記事 by ざこ » 16年前

同じ結果になりました。

バグ

Re:C++

#6

投稿記事 by バグ » 16年前

あ、ごめんなさい、上の書き込みは勘違いです。気にしないでくださいm(__)m

バグ

Re:C++

#7

投稿記事 by バグ » 16年前

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

ざこ

Re:C++

#8

投稿記事 by ざこ » 16年前

cout << name; の部分で同じエラー内容です。

バグ

Re:C++

#9

投稿記事 by バグ » 16年前

うわ、間違ってた…(^_^;)

cout << endl;

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

バグ

Re:C++

#10

投稿記事 by バグ » 16年前

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

ざこ

Re:C++

#11

投稿記事 by ざこ » 16年前

おおいけました。お手数ですがname.c_str();というのがどこから出てきたのか教えて下さい。

バグ

Re:C++

#12

投稿記事 by バグ » 16年前

このサンプルソースのNekoクラスの中にnakuというメンバ関数があるように、std::stringクラスにもメンバ関数が存在します。

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

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

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

dic

Re:C++

#13

投稿記事 by dic » 16年前

私もVC++6.0 使ってみましたがエラーは発生しませんでしたね
インストールに失敗しているのではないでしょうか?

ざこ

Re:C++

#14

投稿記事 by ざこ » 16年前

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

閉鎖

“C言語何でも質問掲示板” へ戻る