Для всех намерений и целей структуры являются классами в C ++, за исключением того, что их члены по умолчанию имеют значение public, а не private. Из-за оптимизации возможны незначительные различия, специфичные для реализации, но они не влияют на стандартную функциональность, которая одинакова для классов и структур в C ++.
Во-вторых, почему функция "dump"? Просто реализуйте это прямо в операторе потока:
template<typename T>
std::ostream& operator << (std::ostream& o, const point<T>& a)
{
o << "x: " << a.x << "\ty: " << a.y << std::endl;
return o;
}