gcc问题 - 没有匹配的函数调用

时间:2011-05-12 07:03:47

标签: c++ gcc

有人可以帮我做这个工作吗?

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 个答案:

答案 0 :(得分:2)

在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);
    }
};