2012-07-12 42 views
1

我有一个教室,它拥有shared_ptrs的载体,选择的对象,像这样:C++ - “非专业化的类模板”错误与shared_ptr的

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; 
} 
+0

你试过vector >选项; ? – marcinj 2012-07-12 22:58:38

+0

@luskan那没用! – 2012-07-12 23:15:12

回答

2

在这个答案中有点猜测,因为你还没有发布Room类的代码。我假设这个代码

private: 
vector<shared_ptr<Option> > options; 

Room.h。您的Option.h文件包括Room.h,因此Room类在Option类之前被声明。所以当编译Room类的析构函数并且shared_ptr实现尝试删除Option对象时,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上的某些操作正在调用其中一个(更可能是前者)的调用。

+0

oOoh我明白了,这很有道理。我确实需要ro参考室,因为我有“virtual shared_ptr getRoom();”这也是在子类RoomOption中重写的。我已经宣布房间的析构函数,它显然还没有修复它...... – 2012-07-12 23:11:58

+0

我想通过使用int ID而不是实际引用房间来引用选项中的房间的方式。如果你有任何见解,我仍然想知道为什么析构函数不按照你所建议的方式工作。 – 2012-07-12 23:28:43

+0

@JeanFinley我错误地声称''spared_ptr'析构函数需要'T'是一个完整的类型,[它不](http://home.roadrunner.com/~hinnant/incomplete.html)。但是,如该链接所示,'shared_ptr (T *)'和'shared_ptr :: reset(T *)'都需要'T'是一个完整的类型。因此,请尝试从'Room'的成员函数注释代码,以便调用其中的任何一个。请记住,既然你有一个'vector',那么任何改变'vector'的操作都可能是罪魁祸首。 – Praetorian 2012-07-12 23:31:10

2
vector<shared_ptr<Option >> 

几乎这样做吧:)

vector<shared_ptr<Option> > 

这是两个>字符,当触摸时会引起你看到的奇怪错误。它被解释为>>运营商。

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

+0

Doh!谢谢。修正了它,但我仍然有同样的问题。奇怪的是,我也有一个向Item对象的shared_ptrs向量(同样的语法,但是使用Item而不是Object),而且这个向量可以很好地工作......并且,谢谢你的出色表示。^ _^ – 2012-07-12 22:47:58