マップ内のマップされた値を使用して要素のベクトルを作成したいコードがあります。以下のコードは Visual Studio で正常に動作します (そして、私が知る限り、正当に思えます) が、g++ は同意しません。
template<class PAIR>
typename PAIR::second_type foo(const PAIR& arg)
{
return (arg.second);
}
class A
{
private:
typedef std::map<int, std::wstring> map_t;
map_t m_map;
public:
void bar()
{
// Attempt to pulled the mapped type from the map into the vector
std::vector<std::wstring>vect(m_map.size());
std::transform(m_map.begin(), m_map.end(), vect.begin(),
&foo<map_t::value_type>); // <-- error here, see below, also
// other attempts that all failed:
// - std::transform(..., boost::bind(foo<map_t::value_type>, _1));
// - std::transform(..., boost::bind(&map_t::value_type::second, _1));
// - also tried casting foo to a specific function type
// - also tried "template<class T> T itself(T arg) { return T; }" applied to all the above functor candidates, a la "std::transform(..., itself(<<functor>>));"
}
};
残念ながら、現時点では正確なエラー テキスト (使用するオーバーロードされた関数を特定できないことに関するもの) または g++ の特定のバージョン (最新版は Ubuntu で配布されています) を持っていませんが、それを取得したら、この投稿を更新してください。
それまでの間、提供されているファンクターの型を g++ が解決できない理由を誰か説明できますか?