2014-11-25 52 views
1

我有一個類定義爲.H如下:丟棄限定符訪問類中某個地圖的向量時出錯?

#ifndef C1_H 
#define C1_H 

#include <iostream> 
#include <map> 
#include <string> 
#include <vector> 

class C1{ 
     private: 
       std::map<std::string, std::vector<int>> cmap; 
     public: 
       C1(); 
       ~C1(); 
       friend std::ostream& operator<< (std::ostream& os, const C1& c); 
}; 

#endif 

我有輸出流功能的麻煩。在cpp文件,我把它定義爲:

ostream& operator<< (ostream& os, const C1& c) { 
     vector<string> strlist= //a vector of the strings associated in the map; 
     cout << *(strlist.begin()+3) << endl; //this was for testing where the error was 
     for (int j = 0; j < 9; j++) { 
       int size = c.cmap[*(strlist.begin() + j)].size(); 
       for (int k = 0; k < size; k++) { 
         os << (c.cmap[*(strlist.begin()+j)]].[begin()+k])<<endl; 
       } 
     } 
     return os; 
} 

但得到以下錯誤:錯誤:通過 '常量的std ::地圖,

錯誤:通過' 常量的std ::地圖,標準: :vector>'as'this'argument'std :: map < _Key,_Tp,_Compare,_Alloc> :: mapped_type & std :: map < _Key,_Tp,_Compare,_Alloc> :: operator [](const key_type & )[with _Key = std :: basic_string; _Tp = std :: vector; _Compare = std :: less>; _Alloc = std :: allocator,std :: vector >>; std :: map < _Key,_Tp,_Compare,_Alloc> :: mapped_type = std :: vector; std :: map < _Key,_Tp,_Compare,_Alloc> :: key_type = std :: basic_string]'丟棄限定符[-fpermissive] int size = t.tokenmap [*(type.begin()+ j)]。size ();

編譯罰款時,我從ostream運算符重載的定義中刪除常量保護,但是,我相信我應該能夠用const保護來做到這一點,根據我的老師,這是更好的做法,得到現在就養成它的習慣。任何人都可以指導我爲什麼不編譯?

雖然我會這樣做,因爲ostream是朋友類,我將能夠訪問私有成員(就像平常一樣,我使用相同的基本結構來爲我的大部分運算符< <重載並訪問私有成員全部時間),但我認爲這個問題與const受保護對象內部有一個向量有關,也可能以某種方式受const保護(只是一個想法......我從來沒有用地圖重載< <) ,所以這對我來說是新的),導致了預選賽問題。我很樂意聽到你們可能提出的任何建議,因爲我真的想用常量保護來做到這一點,而不是放棄它。提前致謝!

+1

'std :: map'的'operator []'是非const的,因爲如果該鍵不存在,它將插入一個元素。 – 2014-11-25 06:17:28

回答

1

在:

int size = c.cmap[*(strlist.begin() + j)].size(); 

你應該寫:

int size = c.cmap.at(*(strlist.begin() + j)).size(); 

代替。

您正在通過c作爲const C1&,這意味着c.cmap也是const

std::map沒有const過載operator[],因爲operator[]執行插入如果密鑰不存在。這是爲了說明如下:

std::map<std::string, int> map; 
map["test"] = 1; 

工作。

+0

真棒夥計,謝謝一堆!完美地工作。沒有意識到還有另一種使用地圖的方式;我們沒有使用任何東西,只是在課堂上的括號,所以我沒有意識到他們有像常規矢量一樣的回報功能。另外,謝謝你的好解釋!幫助像我這樣的新秀出現在那裏。肯定是有道理的,因爲你所說的括號也可以進行插入,所以不受const保護。 – Rich 2014-11-25 06:44:57

相關問題