C ++ - shared_ptr中的“Unspecialised class template”错误

时间:2012-07-12 22:23:49

标签: c++ templates shared-ptr

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

private:
vector<shared_ptr<Option> > options;

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

  • 'shared_ptr':非特殊化的类模板不能用作模板参数'_Ty'的模板参数,期望是真实的类型
  • 'std :: tr1 :: shared_ptr':使用类模板需要模板参数列表

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

还有一些地方会出现错误“'选项':未声明的标识符”,这让我觉得它可能是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;
}

2 个答案:

答案 0 :(得分:2)

vector<shared_ptr<Option >>

差不多做得那么:)

vector<shared_ptr<Option> >

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

顺便说一句,感谢您将代码完全按照发布,而不是将其重新键入并可能隐藏错误。

答案 1 :(得分:2)

由于您尚未发布Room类的代码,因此在此答案中有一些猜想。我假设这段代码

private:
vector<shared_ptr<Option> > options;

位于 Room.h 中。您的 Option.h 文件包含 Room.h ,因此Room类在Option类之前声明。因此,当编译Option类'析构函数并且Room实现尝试删除shared_ptr对象时,Option是不完整的类型。

从上面的代码中,我不明白为什么 Option.h 需要包含 Room.h ,实际上,它应该是相反的方式。如果它确实需要包含该文件,您应该能够通过在 Room.cpp 中明确声明Room::~Room()脱节来解决该问题。

修改
结果是~shared_ptr<T> does not require T to be a complete type。但是,shared_ptr<T>( T* )shared_ptr<T>::reset( T* )会这样做,问题可能是因为vector上的某些操作正在调用其中一个操作(更可能是前者)。