Ошибка функтора шаблона в g ++ - PullRequest
0 голосов
/ 15 июня 2009

У меня есть код, в котором я хотел бы построить вектор элементов, используя сопоставленные значения на карте. Приведенный ниже код прекрасно работает в 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 ++ не может определить тип предоставляемого функтора?

1 Ответ

1 голос
/ 15 июня 2009

Следующие компиляции на моей машине:

#include <map>
#include <vector>
#include <algorithm>
#include <string>

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()
    {
        std::vector<std::wstring>vect(m_map.size());
        std::transform(m_map.begin(), m_map.end(), vect.begin(),
            &foo<map_t::value_type>);  
    }
};

командная строка:

g++ -c overt.cpp

версия:

$ g++ --version
i686-apple-darwin9-g++-4.0.1 (GCC) 4.0.1 (Apple Inc. build 5490)
Copyright (C) 2005 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
...