有人可以帮我做这个工作吗?
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);
}
};
答案 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);
}
};