Могут ли имена методов C++ быть уточнены именем класса в заголовке?

StackOverflow https://stackoverflow.com/questions/688802

Вопрос

Простой вопрос: допустим ли это С++:

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++, чем здесь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top