我有一个类Room,它有一个shared_ptrs向量到Option对象,如下所示:
private:
vector<shared_ptr<Option> > options;
但由于某些原因,当我构建时,我收到以下错误:
奇怪的是,我也有一个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;
}
答案 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
上的某些操作正在调用其中一个操作(更可能是前者)。