Суть вопроса очень проста - почему после определения класса ставится точка с запятой, а после определения функции - нет? Я сначала подумал, что это из-за того, что в одном месте происходит и объявление, и определение, но, с другой стороны, с функцией такая же ситуация.
struct Y
{
// ...
};
void someFoo()
{
// ...
}