使用VS 2005编译一个程序,代码大致如下: 
struct Raster_Info : public Spatial_Info 

unsigned long x_block_size,y_block_size;/** 块宽、块高*/ 
double invilid_value[OT_RASTER_BAND_MAX]; 
double resolution_x, resolution_y; 
std::map <unsigned short, std::string> band_descs; 
}; class IRasterDataLayer : public IDataLayer 

public: 
virtual ~IRasterDataLayer(); 
protected: 
IRasterDataLayer(IDataSetWeakPtr ptrDataSet); Raster_Info m_rasterInfo; IRasterPyramidPtr m_ptrPyramid; std::vector <IRasterDataBandPtr> m_rasterBands; 
}; const Raster_Info& IRasterDataLayer::GetRasterInfo() const 

return m_rasterInfo; 

然后调用IRasterDataLayer::GetRasterInfo()函数 IRasterDataLayerPtr  m_InLayer; 
...... 
const otDataSource::Raster_Info& rasterinfo = m_InLayer->GetRasterInfo(); 
 std::map <unsigned short,std::string>::iterator  iter;  
for(iter=rasterinfo.band_descs.begin(); iter!=rasterinfo.band_descs.end();iter++)  

...... 
} 在for(iter=rasterinfo.band_descs.begin(); iter!=rasterinfo.band_descs.end();iter++)发生一个错误: 
error C2679: 二进制“=”: 没有找到接受“std::_Tree <_Traits>::const_iterator”类型的右操作数的运算符(或没有可接受的转换) 
    看了mayer的effective   c++,错误原因似乎是: 
bitwise(二进制位)const   派别坚持认为,一个   member   function(成员函数),当且仅当它不改变   object(对象)的任何   data   members(数据成员)(static(静态的)除外),也就是说如果不改变   object(对象)内的任何   bits(二进制位),则这个   member   function(成员函数)就是   const。bitwise   constness(二进制位常量性)的一个好处是比较容易监测违例:编译器只需要寻找对   data   members(数据成员)的   assignments(赋值)。实际上,bitwise   constness(二进制位常量性)就是   C++   对   constness(常量性)的定义,一个   const   member   function(成员函数)不被允许改变调用它的   object(对象)的任何   non-static   data   members(非静态数据成员)。      编译平台是: VS 2005, win xp sp2,  到底是不是这样呢?

解决方案 »

  1.   

         我将std::map  <unsigned short,std::string>::iterator  iter;   
      这句改为std::map<unsigned short,std::string>::const_iterator  iter; 就好了,这是为什么呢?
      

  2.   

    effective   c++中讲const的那部分有讲的。
    你返回的rasterinfo是const的,只能用const_iter以只读的方式访问。
      

  3.   

    const otDataSource::Raster_Info& rasterinfo = m_InLayer->GetRasterInfo(); 这个是Const的,那么他的成员也应该是Const的,你用非const的迭代器,不是可以改变对象本身了嘛?
    这个就是原因了。
      

  4.   

    const otDataSource::Raster_Info& rasterinfo
      

  5.   

    const otDataSource::Raster_Info& rasterinfo = m_InLayer->GetRasterInfo();  
    std::map  <unsigned short,std::string>::const_iterator  iter;或者:
    otDataSource::Raster_Info& rasterinfo = m_InLayer->GetRasterInfo();  
    std::map  <unsigned short,std::string>::iterator  iter;如果使用const_iterator,那么就不能使用(*iter)来更改迭代器对应的对象。
      

  6.   


    对。可参考effective C++中讲const char *与char * const的区别的那部分。