проблема gcc - нет соответствующего вызова функции - PullRequest
2 голосов
/ 12 мая 2011

Кто-нибудь может помочь мне с этой работой?

Donor-enumerate () не работает, gcc не выдает ошибку функции соответствия.

template < class T >
struct mesh;

template < class T >
struct meshBone
{
    friend struct mesh< T >;
private:
    T *_obj;
};

template < class T >
struct mesh
{
    template < class U >
    void enumerate( U& rcv )
    {

    }

    void connect( T* obj, mesh< T >* donor )
    {
        class object_replacement
        {
            T* _obj;
        public:
            object_replacement ( T* t ): _obj(t) {}
            bool operator()( meshBone<T> * bone )
            {
                bone->_obj = _obj;
                return true;
            }
        } obj_rpl(obj);

        donor->enumerate (obj_rpl);
    }
};

1 Ответ

2 голосов
/ 12 мая 2011

В C ++ 03 вы не можете использовать локальный тип в качестве аргумента типа шаблона.

object_replacement - это локальный тип (локально для mesh<T>::connect(T*, mesh*)), и вы пытаетесь использовать его какаргумент шаблона U из mesh<T>::enumerate<U>.gcc выдает это довольно бесполезное сообщение об ошибке, что «нет подходящей функции».

Правило «нет локальных типов» было удалено в C ++ 0x, поэтому, если у вас достаточно свежая версия gcc, вы можетескомпилируйте, используя -std=c++0x, и это должно работать нормально (я проверял это с помощью gcc 4.5.1).Если это не вариант, вам нужно просто сделать object_replacement не локальным типом, т.е. извлечь его и сделать его вложенным типом шаблона класса mesh<T>:

template <class T>
struct mesh
{
    template <class U> void enumerate(U& rcv) { }

    class object_replacement
    {
        T* _obj;
    public:
        object_replacement (T* t) : _obj(t) {}
        bool operator()(meshBone<T>* bone)
        {
            bone->_obj = _obj;
            return true;
        }
    };

    void connect(T* obj, mesh<T>* donor)
    {
        object_replacement obj_rpl(obj);
        donor->enumerate(obj_rpl);
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...