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