2012-07-12 60 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