プロが教える店舗&オフィスのセキュリティ対策術

shared_ptrクラスを使いたいのですが、使えません、どうしてでしょうか?ソースはこれです。
#include<iostream>
#include <string>
#include <fstream>
#include<memory>
using namespace std;
class SMonster{
string name;
int power;
public:
SMonster();
SMonster(int p);
~SMonster(){
};
void SetPower(int p);
int GetPower(SMonster& t)const;
void walk(const string& str);
int GetPoint(void)const;
};
class B {};
class D : public B {};
int main(void)
{
shared_ptr<D> sp0(new D);
SMonster m(200);
SMonster n(100);
std::cout<<m.GetPower(m)<<std::endl;
std::cout<<n.GetPower(n)<<std::endl;
ShowWindow(10);
}

A 回答 (5件)

そのURLは「Visual Studio 2008」の「標準 C++ ライブラリ TR1 拡張リファレンス」説明ページですが、VC2008をお使いですか。


回答に「\visual studio 2005\」とありますが、元々新規C++仕様策定中のお試しなので、
VC2008のSP1 (元はFeature Pack)の追加機能なので、2005では使えません。(指摘済)

http://msdn.microsoft.com/ja-jp/library/bb982198 …
「TR1 拡張は、Visual Studio 2008 Service Pack 1 (VS2008 SP1) の新機能の一部として提供されています。
VS2008 SP1 の入手方法については、http://msdn.microsoft.com/ja-jp/library/e2h7fzkw … を参照してください。」

また、もしVC2008に乗り換える場合でも、
そのページには、「名前空間 : std::tr1」と書いてあります。

つまり、shared_ptrは、std::shared_ptrではなく、std::tr1::shared_ptrです。
よって、using namespace std;ではusingの対象になりませんから、
まず、using namespace std::tr1;である必要があります。(指摘済)
    • good
    • 0
この回答へのお礼

そうだったのですか。わかりました。回答ありがとうございました。

お礼日時:2009/04/26 14:40

> 回答ありがとうございます。

MSDNで調べたら、
> <memory>をインクルードすれば、できるようなことが載っていたのですが。

そのページは何処ですか?
「できるようになるだろう」ではなくて「できる」ですか?
#3の方もかかれてますがshared_ptrの仕様もまだ正式には決まってませんし、
VC(2008の最新)でもtr1でしか使えないはずですが…。
(namespace stdではなくnamespace std::tr1になりますのでusingするならこちらも)

または、boostを別途インストールしていれば、boost::shared_ptrがあるのですが、
インストールやincludeパス設定せずに書いてませんか?>boost::shared_ptr
    • good
    • 0
この回答へのお礼

回答ありがとうございます。Uboostはインストールしていません。RLはhttp://msdn.microsoft.com/ja-jp/library/bb982026 …です。

お礼日時:2009/04/26 12:03

Visual Studio 2008 ではまだ shared_ptr はないはずなんだけど....


どのような情報か, URL はわかりませんか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。http://msdn.microsoft.com/ja-jp/library/bb982026 …で見かけました。

お礼日時:2009/04/26 12:01

「使えない」とはどういうことですか?



現時点では、shared_ptrは標準ではありませんが、どちらのshared_ptrを使ってますか?

コンパイルエラーなら、ヘッダはインクルードしてますか?
(例:Boostをインストールしているなら#include <boost/shared_ptr.hpp>とか、<tr1/memory>とか…)

例えばstd::tr1::shared_ptrとか(boostなら)boost::shared_ptrと書いても同様ですか。

この回答への補足

使えないとは、shared_ptrクラスが定義できないと言うことです。
c:\documents and settings\mycomputer\my documents\visual studio 2005\projects\smonst1\smonst1\main.cpp(45) : error C2065: 'shared_ptr' : 定義されていない識別子です。
処理系はVC++です。言葉足らずですいません。

補足日時:2009/04/26 01:48
    • good
    • 0
この回答へのお礼

回答ありがとうございます。MSDNで調べたら、<memory>をインクルードすれば、できるようなことが載っていたのですが。std::tr1::shared_ptrとか(boostなら)boost::shared_ptrと書いてみても駄目でした。

お礼日時:2009/04/26 01:47

このソースを見せて, あなたは何をしたいのですか? 「使えない」と言っていることからすると, ひょっとして何らかの問題が起きていてそれを解決したいと思っているのでしょうか?


もしそうなら, あなたには書かなければならないこと (そして書けなければならないこと) がもっといっぱいあります. 例えばどこでどのような問題が起きていて, 本当はどうなるはずであるだとか, あなたがどの処理系を使っているのかとか, それくらいは書いて当然ですよね.
    • good
    • 0
この回答へのお礼

どうもすみませんでした。 ご指摘ありがとうございます。
参照カウントを使ってリソースを管理するオブジェクト作りたいのですが、こんなエラーが出ます。
c:\documents and settings\mycomputer\my documents\visual studio 2005\projects\smonst1\smonst1\main.cpp(45) : error C2065: 'shared_ptr' : 定義されていない識別子です。
c:\documents and settings\mycomputer\my documents\visual studio 2005\projects\smonst1\smonst1\main.cpp(45) : error C2275: 'D' : この型は演算子として使用できません
c:\documents and settings\mycomputer\my documents\visual studio 2005\projects\smonst1\smonst1\main.cpp(42) : 'D' の宣言を確認してください。
c:\documents and settings\mycomputer\my documents\visual studio 2005\projects\smonst1\smonst1\main.cpp(45) : error C3861: 'sp0': 識別子が見つかりませんでした
このshared_ptrを使うにはどうしたらいいのでしょうか?
処理系はVC++です。

お礼日時:2009/04/26 01:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!