Я начал получать сообщение об ошибке «ошибка C2059: синтаксическая ошибка:« аргумент по умолчанию »» для строки кода, которая объявила функцию со строковым аргументом, которому был задан параметр по умолчанию.Очевидно, это немного расстраивало, так как сообщение об ошибке не совсем показательно (я знаю, что это «аргумент по умолчанию»!), И точное объявление будет работать в другом месте.
После небольшого изменения в объявлении яобнаружил, что его положение в содержащем его классе действительно дало эффект.Сужая его, я обнаружил, что я несколько ошибочно объявлял другую функцию, добавив точку с запятой после одного из его параметров по умолчанию.Компилятор выглядел прекрасно с этим, что казалось странным.Я исследовал немного больше и придумал следующий тестовый пример, чтобы попытаться выяснить суть происходящего:
enum TestEnum1
{
TEST_ONE
};
class TestClass
{
public:
enum TestEnum2
{
TEST_TWO,
TEST_THREE,
TEST_FOUR
};
void Func1( int iParm = TEST_ONE; ); // additional semicolon here
void Func2( std::string strParm = "" );
};
Как показывает приведенный выше код, Func2 выдаст ошибку компиляции, которую я упомянулвыше.Если я переместу Func2 выше Func1, то все будет хорошо.
Если я переключу параметр по умолчанию в Func1 на явное число или использую перечисление, объявленное в TestClass, то получу ожидаемую синтаксическую ошибку для этой строки.
По сути, странно то, что, если я установлю значение параметра по умолчанию в enum , не определенное непосредственно в текущем классе , и буду слишком доволен точкой с запятой, компиляторигнорируйте синтаксическую ошибку, пока какая-то, казалось бы, не связанная вещь окончательно не заставит парсер очень непостижимым образом умереть.
Я просто что-то упускаю полностью?Это ожидаемое поведение?Конечно, я не решаюсь назвать это ошибкой в компиляторе, но это вряд ли кажется правильным.Если я просто неправильно понимаю что-то о стандарте, то я хотел бы знать, где я ошибаюсь.