Попытка Билли приличная, но обычный ответ на пропущенный ';' это для компилятора так сказать. С другой стороны, пропущенный '}' может серьезно запутать стандартные заголовки, включенные впоследствии, потому что весь их контент находится в области пространства имен или класса, который должен быть закрыт. Также, ';' пропущенный момент обнаруживается быстрее, в то время как пропущенный '}' не обязательно является ошибкой, поэтому компилятор просто осуждает первое, что не имеет смысла в этой области.
Кроме того, в строке 454 утилиты для компилятора 2010 года находится открывающая скобка для специализации tuple_size для std :: pair. Пост препроцессор это определение будет выглядеть так:
template < ... >
struct tuple_size< ::std::pair<_Ty1, _Ty2> >
Если вы забыли '}', закрывающее пространство имен, тогда это не то, где pair<>
существует больше. Вместо этого, поскольку он объявлен так:
namespace std { template < ... > struct pair ... }
Какая бы область не была закрыта, теперь объявляется std
, а struct tuple_size< ::std::pair<...> >
не имеет никакого смысла для синтаксического анализатора. Поскольку это недопустимое имя, оно, как правило, притворяется, что его тут же нет, а затем «{» в глобальном масштабе без какого-либо смысла, прежде чем это будет довольно странно.
Кстати, часто невысказанное преимущество создания минимальных примеров, вызывающих проблему, состоит в том, что вы в конечном итоге НАХОДИТЕ проблему, пытаясь ее осуществить.