我有一個類定義爲.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保護(只是一個想法......我從來沒有用地圖重載< <) ,所以這對我來說是新的),導致了預選賽問題。我很樂意聽到你們可能提出的任何建議,因爲我真的想用常量保護來做到這一點,而不是放棄它。提前致謝!
'std :: map'的'operator []'是非const的,因爲如果該鍵不存在,它將插入一個元素。 – 2014-11-25 06:17:28