1

我有一个类 Room,它包含一个 shared_ptrs 到 Option 对象的向量,如下所示:

private:
vector<shared_ptr<Option> > options;

但是由于某种原因,当我构建时,我收到以下错误:

  • “shared_ptr”:非特化类模板不能用作模板参数“_Ty”的模板参数,需要一个真实类型
  • 'std::tr1::shared_ptr' : 使用类模板需要模板参数列表

奇怪的是,我还有一个 shared_ptrs 向量,语法完全相同,但那个没有问题。

还有很多地方会出现错误“'Option': undeclared identifier”,这让我觉得这可能是 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();
};

选项.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之前被声明OptionOptionRoom类的析构函数被编译并且shared_ptr实现试图删除Option对象时,一个不完整的类型也是如此。

从上面的代码,我看不出为什么Option.h需要包含Room.h,其实应该是反过来的。如果确实需要包含该文件,您应该能够通过在Room.cppRoom::~Room()中明确声明out-of-line来解决该问题。

编辑:
原来~shared_ptr<T> 不需要 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> >

触摸时,这两个>字符会导致您看到的奇怪错误。它被解释为>>运算符。

顺便说一句,感谢您按原样发布代码,而不是重新输入代码并可能隐藏错误。

于 2012-07-12T22:26:09.790 回答