2016-11-01 12 views
2

この初期化が動作しない原因は何ですか?変換演算子を使用してマップを初期化する

#include <map> 
using std::map; using std::pair; using std::make_pair; 
struct P { 
    char a_, b_; 
    P(char a, char b) : a_{a}, b_{b} {} 
    operator pair<char,char>() { return make_pair(a_, b_); } 
}; 
int main() { 
    map<char,char> qmap { P('a','b') }; 
} 

Pで変換演算子がブレース-initialisierリスト内で暗黙的に適用することができないように見えますか?それとも別のことですか?

答えて

3

それはすることができますが、キーポイント忘れてしまった:S value_typemap「あなたの例では、あなたのqmapを満たすために2つの変換(Ppair<char, char>pair<char const, char>を)必要があると思いますので、S value_typeが、実際にpair<const Key, Value>である」とします。これはルールが許すもう1つの変換です。

コンバージョンオペレータが

operator pair<char const,char>() { return make_pair(a_, b_); } 

あなたのコードcompilesに変更した場合。

+1

同時に2つの答え。あなたは "受け入れ"を得る... – towi

4

std::mapのキー部分はconstなので、std::map<char, char>の要素の型はstd::pair<const char, char>です。タイプはここで一致しません。中括弧で返されたstd::pair<char, char>は、std::initializer_list<std::pair<const char, char>>を構築するために使用することはできません(さらにstd::map<char, char>を構築してください)。

あなたは

operator pair<const char,char>() { return make_pair(a_, b_); } 

または

operator std::map<char, char>::value_type() { return make_pair(a_, b_); } 

にそれを変更すると、コードは正常に動作します。

+1

2つの回答が同時に表示されます。あなたは "upvote"を得る... – towi

関連する問題