頭を包み込むことができないような行動をとった。次のように定義されたクラスがあるとします(説明のための簡単な例):
class some_class
{
public:
some_class()
{
x_["0"] = "0";
x_["1"] = "1";
y_[0] = x_.find("0");
y_[1] = x_.find("1");
}
int some_function(int i)
{
if(std::find(y_.begin(), y_.end(), x_.find("1")) != y_.end())
{
std::cout << "Found!" << std::endl;
return 1001;
}
return -1001;
}
private:
std::unordered_map<string, string> x_;
std::array<unordered_map<string, string>::iterator, 2> y_;
};
コードはデバッグモードのVisualStudio2012 RCでコンパイルされます(他のモードはテストされていません)が、some_functionの呼び出し中に、プログラムは次のアサーションメッセージで失敗します
... microsoft visual studio 11.0 \ vc \ include \ list行:289
式:互換性のないイテレータを一覧表示します。
呼び出し元のコードは次のようになります
auto vector<int> as;
as.push_back(1);
auto vector<int> bs;
auto some = some_class();
std::transform(as.begin(), as.end(), std::inserter(bs, bs.begin()), [=](int i) { return some.some_function(i); });
質問:
この種の取り決めの問題は何でしょうか?メンバー変数としてではなくsome_functionでx_とy_を宣言すると、コードが正常に実行されます。クラスは、状況を考慮に入れる必要がある場合、std::transformのように呼び出され/使用されます。
接線はさておき、次の宣言はコンパイラによって拒否されるように見えますが、拒否する必要がありますか?
std::unordered_map<string, string> x_;
std::array<decltype(x_.begin()), 2> y_;
エラーメッセージは
エラーC2228:「。begin」の左側にはclass / struct/unionが必要です