2016-11-17 119 views
1

我很想知道矢量類型定義中「ref」的含義是什麼。C++ Vector關鍵字「ref」

我新的C++和上一段代碼,我剝離出來學習,我發現

vector<ref<StupidBug> > bugs; 

其中「StupidBug」是一類。

它不會在GCC編譯/ C++ 11,因爲「模板參數‘>’是無效的」,但移動「>」的左側,接近前一個仍然給出了同樣的錯誤

這使我感到困惑,我不知道錯誤在哪裏。

這段代碼已經過了幾年了,可能會寫錯嗎? 「ref」屬於C++嗎?

這是一個多版本嗎?或模板?

的背景資料:

全是有關插入和移動網格「錯誤」和矢量持有錯誤的數量,並把它們在一定的位置。

這裏的代碼,首先我有一個Stupidbug類

class StupidBug 
{ 

public: 
    int x(); 
    int y(); 

    // member initialization list 
    StupidBug(GraphID_t i=-1): cellID(i) {} 

    void move(); 
    void draw(const eco_string& canvas); 
}; 

並與「裁判」的載體是另一個類:

class Model: public Space 
{ 

public: 
urand u;  //random generator for positions 
int tstep; //timestep - updated each time moveBugs is called 
int scale; //no. pixels used to represent bugs 
vector<ref<StupidBug> > bugs; 
addBugs(int nBugs); 
void addBugs(); 
void moveBugs(); 
void draw(TCL_args args); 
}; 

感謝您的回答!

+1

這不是關鍵字。它是一個函數模板的名稱。 – EJP

+0

根據@StoryTeller的評論,您可能正在尋找std :: vector > – SVictor

+0

@EJP你是完全錯誤的。它是用戶定義的智能指針。 –

回答

7

另一個原因停止using namespace std;

這是函數模板std::ref<T>

vector<ref<StupidBug> >無法編譯,因爲std::vector期望類型(其實2類型,但另一種是默認的),你提供的功能std::ref<StupidBug>


這可能是你的老項目有另一個ref模板,不知何故,當c與C++ 11一起,它選擇std::ref而不是該模板。

0

我幾乎可以肯定它是一個類似於智能指針的用戶定義類,它被設計用於替代不能用於類std::vector的標準類std::auto_ptr

該類可能使用對象的引用計數。的

現在不是

vector<ref<StupidBug> > bugs; 

比如,你可以寫

vector<std::unique_ptr<StupidBug> > bugs; 

注意這個記錄的兩個「>」符號

vector<std::unique_ptr<StupidBug> > bugs; 
           ^^^^ 

這意味着代碼是當沒有新的智能指針時,根據C++ 2003標準編譯,除了std::auto_ptr不能與矢量一起使用。

有舊的C++標準相對於std::auto_ptr中的問題。作爲導致新智能指針是在新的C++標準引入等,其可以與std::vector和其他標準容器一起使用std::unique_ptrstd::shared_ptr

該類使用因爲代碼是舊的和新的標準還沒有與它的新類採納或者它具有的功能,在標準缺失或更適合一些類的任務。

在他的書中More Effective C++那時候例如斯科特邁爾斯是展示如何使用引用計數智能指針可以寫。這個主題在C++ 2003標準的天那WSS受歡迎。:)

很明顯,這有什麼共同與同樣是在C++ 2011介紹,除了它的名字標準功能std::ref。:)

當代碼被寫有根據C++標準(D.10的auto_ptr)

既不標準功能 std::ref。:)

只要通過其中類定義的報頭的樣子。:)

現在3210

The class template auto_ptr is deprecated. [ Note: The class template unique_ptr (20.7.1) provides a better solution. —end note ]

因此,由於在新的C++標準引入的新的智能指針似乎就沒有必要再使用這個用戶定義的類參考。

+1

太多假設導致關於不是代碼的錯誤結論看到。從錯誤消息中可以明顯看出,這是一種嘗試濫用'std :: ref'而不是'std :: reference_wrapper'的方法。 – StoryTeller

+1

@StoryTeller你是完全錯誤的。它是一個用戶定義的類。問題是,所需的標題不包括在內,僅此而已。:) –

+0

不,這就是你(錯誤地)假設發生的事情。這個問題本身沒有任何建議。嘗試一個[簡單的例子在海灣合作委員會](http://ideone.com/TwA80b)產生確切的錯誤OP得到*「錯誤:模板參數2是無效的」* – StoryTeller

0

感謝您的回答我能夠解決這個問題。

其實代碼是從2006年和所使用的C++標準03

ref<StupidBug> 

是使用一些額外的功能及與不是「的std ::裁判」功能的自定義智能指針的模板。它是在一個名爲「classdesc」

因爲即使我不使用某種原因標題定義爲「使用命名空間std;」編譯器用什麼來使用「ref」函數而不是模板。

對我來說,解決方法已經使用

classdesc::ref<StupidBug> 

是「classdesc」原始模板生活在那裏。

從C++ 11(shared_ptr)使用新的samart指針不起作用,或者是因爲原始模板的額外功能。

如果@Vlad來自莫斯科或@StoryTeller,我不知道誰更合適......