2013-04-26 120 views
0

我正在爲使用STL的映射類實現的簡單圖類編寫一個頭文件。但是,我遇到了模板參數的問題,它似乎告訴我,我無法聲明「沒有類型」的矢量和地圖對象,但我看不到我沒有給它所需的類型。此外,矢量和地圖類包含在指令中。 private:已被註釋掉進行測試。我覺得這是某種語法錯誤。基於STL映射的圖類中的模板參數類

Graph.h

#include <iostream> 
#include <cstdlib> 
#include <vector> 
#include <map> 

template <typename T> 
class Graph 
{ 
public: 
    Graph(); 
    Graph(const Graph<T>& other); 
    Graph& operator=(const Graph<T>& other); 
    ~Graph(); 

    vector<T> AdjacentNodes(const T& n); 

//private: 
    map<T, vector<T>> m; 
}; 
+3

你是否在你的真實代碼中用'std ::'預先加入了'map'和'vector'? – juanchopanza 2013-04-26 19:56:24

回答

0

,(從http://www.cplusplus.com/reference/map/map/,我建議你看看拍攝塊!)

template < class Key,          // map::key_type 
      class T,          // map::mapped_type 
      class Compare = less<Key>,      // map::key_compare 
      class Alloc = allocator<pair<const Key,T> > // map::allocator_type 
      > 

首先,確保你把 「使用命名空間std;」在頂部或預先準備的std物品如與std::

其次,如圖上面的模板,如果你的typename T不是其std::less定義需要創建自己的比較功能的數據類型映射向量(可一個函數指針或函數對象)並將其作爲第三個模板參數輸入。

最後,小心把>>map<T, vector<T>> m;如果您正在使用舊的編譯器,你將需要包括最後兩個>的之間的空間

+0

另外,如果你想讓矢量爲私有的,你可以在你的類聲明的頂部寫上'public:'之前寫下它,因爲類的默認成員是私有的。 – mNeubauer 2013-04-26 20:21:09

+0

對於將「使用名稱空間標準位置」放置到頭文件中的建議,一半是-1。誠然,它會解決這個問題,但這是不好的建議。 – 2013-04-26 23:22:16

+0

謝謝你的提升,我讚賞評論。很高興知道未來! – mNeubauer 2013-04-27 14:56:27

1

使用地圖和矢量類,則需要添加以下頭文件

#include <map> 
#include <vector> 

並且map和vector也是std命名空間的一部分。那麼你需要使用std :: map,std :: vector。