Могут ли имена методов C++ быть уточнены именем класса в заголовке?
-
22-08-2019 - |
Вопрос
Простой вопрос: допустим ли это С++:
class Foo
{
void Foo::doSomething();
};
Суть вопроса:это повторное использование имени класса и двойного двоеточия перед действительным именем метода внутри объявление класса?
У меня возникли проблемы с компиляцией кода, который делает это с использованием g++ 4.2.3.Мне бы хотелось увидеть здесь ссылку на что-то, описывающее синтаксис, прежде чем копаться и менять код.Или понизить версию компилятора;это сборка с использованием g++ 3.3.6.
Ошибка, которую я получаю (примерно):
Foo.h:3: error: extra qualification ‘Foo::’ on member ‘doSomething’
Я загуглил, но ничего не нашел.У меня нет стандарта, и даже если бы он был, мне, вероятно, потребовалось бы немало времени, чтобы найти что-нибудь авторитетное.Я не юрист по языку C++.
Решение
Я взглянул на стандарт, раздел 9.2 будет соответствующей частью.Я не очень хорошо разбираюсь в BNF, но я не видел в BNF для членов класса ничего, что указывало бы на то, что это разрешено.В BNF этот идентификатор даже называется «unqualified-id».
G++ изменил поведение в версии 4.1, и, очевидно, многие другие компиляторы это приняли, но я никогда не видел, чтобы этот стиль использовался, и понятия не имею, зачем кому-то это делать.Поскольку кажется, что он не вызывает ошибки на довольно широком спектре компиляторов, для этого стиля может быть какая-то историческая причина, но, насколько я могу судить, он действительно недействителен.
Единственная хорошая ссылка, которую я нашел через Google, была эта страница, который просто пытается объяснить некоторые изменения в G++ 4.1.
Другие советы
Как и Дэн, я смотрел на «Стандарт» без определенных результатов.Я попробовал ваш код с Онлайн-компилятор Комо (считается наиболее совместимым со стандартами в мире) и получил:
строка 3:ошибка:Квалифицированное имя не разрешено в декларации члена
Если вы заинтересованы в дальнейшем развитии этого вопроса, я предлагаю задать вопрос на comp.lang.c++.модерируемый группа новостей, поскольку там гораздо больше юристов по языку C++, чем здесь.