(GCC環境です。)
#ifndef __DATA_H_
#define __DATA_H_
#include <map>
#include <string>
#include <iostream>
#include <boost/assign/list_of.hpp>
class Data{
public:
Data();
void print_data();
private:
std::map<int, std::string> map_data;
};
#endif
#include "Data.h"
Data::Data(): map_data(static_cast<std::map<int, std::string> &>
(boost::assign::map_list_of<int, std::string>(1, "taro")
(2, "jiro")
(3, "saburo"))){}
void Data:: print_data(){
std::cout<<this->map_data[1]<<std::endl;
}
Data.cpp: コンストラクタ ‘Data::Data()’ 内:
Data.cpp:6:23: エラー: invalid static_cast from type ‘boost::assign_detail::generic_list<std::pair<int, std::basic_string<char> > >’ to type ‘std::map<int, std::basic_string<char> >&’
と言うようなものです。一応、解説ですが、通るコンパイラもあるようですが、GCC環境では
boost::assignでメンバ変数の初期化を行おうとすると、型が不鮮明との趣旨のエラーが出てしまうため、
あえてstatic_castで変換します。(この掲示板でご指摘いただきました。)なお、vector等ではこのスタイル
は問題なく通ります。
なお、本命としては、メンバ変数はconstにしたいのですが、constにした場合は初期化だけのコードは
問題なく通り、データを参照する関数(ここではprint_data)を付け加えると以下のようなエラーになります。
Data.cpp: コンストラクタ ‘Data::Data()’ 内:
Data.cpp:6:23: エラー: invalid static_cast from type ‘boost::assign_detail::generic_list<std::pair<int, std::basic_string<char> > >’ to type ‘std::map<const int, std::basic_string<char> >&’
Data.cpp: メンバ関数 ‘void Data::print_data()’ 内:
Data.cpp:10:30: エラー: passing ‘const std::map<int, std::basic_string<char> >’ as ‘this’ argument of ‘std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const key_type&) [with _Key = int, _Tp = std::basic_string<char>, _Compare = std::less<int>, _Alloc = std::allocator<std::pair<const int, std::basic_string<char> > >, std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type = std::basic_string<char>, std::map<_Key, _Tp, _Compare, _Alloc>::key_type = int]’ discards qualifiers [-fpermissive]
お分かりになる方がいらっしゃりましたら、コメントをいただければ幸いです。