1

クラス Room があり、次のように Option オブジェクトへの shared_ptrs のベクトルを保持します。

private:
vector<shared_ptr<Option> > options;

しかし、何らかの理由でビルドすると、次のエラーが発生します。

  • 'shared_ptr': 特殊化されていないクラス テンプレートは、テンプレート パラメーター '_Ty' のテンプレート引数として使用できません。実際の型が必要です
  • 'std::tr1::shared_ptr' : クラス テンプレートの使用にはテンプレート引数リストが必要です

奇妙なことに、まったく同じ構文のshared_ptrsのベクトルもありますが、それには問題はありません。

「'Option': undeclared identifier」というエラーが発生する場所もたくさんあります。これは、Option クラスに問題があるのではないかと思いますが、問題ないようです。オプションのコードは次のとおりです。

Option.h:

#pragma once
#include "Room.h"
#include <memory>

using namespace std;

class Option
{
protected:
    int id;
    char* text;

public:
    Option(void);
    Option(int, char*);
    virtual ~Option(void);
    char* getText();
    int getID();
};

Option.cpp:

#include "Option.h"
#include "Room.h"
#include <memory>
using namespace std;

Option::Option(void)
{
}

Option::Option(int newID, char* newText){
    id = newID;
    text = newText;
}

Option::~Option(void)
{
}

char* Option::getText(){
    return text;
}

int Option::getID(){
    return id;
}
4

2 に答える 2

4

Roomクラスのコードを投稿していないので、この回答には少し推測があります。私はこのコードを想定しています

private:
vector<shared_ptr<Option> > options;

Room.hにあります。Option.hファイルにはRoom.hが含まれているため、Roomクラスはクラスの前に宣言されOptionます。したがって、クラスのデストラクタがコンパイルされ、実装がオブジェクトを削除しようとするとOption、不完全な型になります。Roomshared_ptrOption

上記のコードから、Option.hにRoom.h含める必要がある理由がわかりません。実際、その逆である必要があります。実際にファイルを含める必要がある場合は、 Room.cppで行外を明示的に宣言することで、問題を回避できるはずです。Room::~Room()

編集:Tが完全なタイプである必要はないことが
わかりました。ただし、実行します。問題は、の一部の操作がこれらの1つ(前者の可能性が高い)への呼び出しを呼び出していることが原因である可能性があります。~shared_ptr<T> shared_ptr<T>( T* )shared_ptr<T>::reset( T* )vector

于 2012-07-12T23:01:50.957 に答える
3
vector<shared_ptr<Option >>

あなたはほとんどその権利をしました:)

vector<shared_ptr<Option> >

>触れると、奇妙なエラーが発生するのは2人のキャラクターです。>>オペレーター として解釈されています。

ところで、コードを入力し直して間違いを隠すのではなく、コードをそのまま投稿していただきありがとうございます。

于 2012-07-12T22:26:09.790 に答える