Могут ли имена методов C ++ быть квалифицированы по имени класса в заголовке? - PullRequest
4 голосов
/ 27 марта 2009

Простой вопрос, действительно ли это C ++:

class Foo
{
    void Foo::doSomething();
};

Суть вопроса: многократное использование имени класса и двойного двоеточия перед именем метода действительно внутри объявления класса?

У меня проблемы с компиляцией кода, который делает это с помощью g ++ 4.2.3. Мне бы очень хотелось увидеть здесь ссылку на что-то, описывающее синтаксис, прежде чем копаться и менять код. Или понизить компилятор; это делает с g ++ 3.3.6.

Ошибка, которую я получаю (примерно):

Foo.h:3: error: extra qualification ‘Foo::’ on member ‘doSomething’

Я сделал Google, но ничего не смог придумать. У меня нет стандарта, и даже если бы я это сделал, мне, вероятно, потребовалось бы много времени, чтобы найти что-нибудь авторитетное. Я не адвокат по языку C ++.

Ответы [ 2 ]

18 голосов
/ 27 марта 2009

Я посмотрел на стандарт, раздел 9.2 будет соответствующей частью. Я не очень хорош в БНФ, но я не видел в БНФ ничего такого для учеников, которое указывало бы, что это разрешено. Идентификатор даже назван "безусловным идентификатором" в BNF.

G ++ изменил поведение в версии 4.1, и, очевидно, многие другие компиляторы приняли это, но я никогда не видел, чтобы этот стиль использовался, и я не знаю, почему кто-то это сделал. Поскольку кажется, что это не вызывает ошибку на довольно большом разнообразии компиляторов, может быть некоторая историческая причина для этого стиля, но, насколько я могу судить, он действительно не действителен.

Единственной хорошей ссылкой, которую я нашел через Google, была эта страница , которая просто пытается объяснить некоторые изменения в G ++ 4.1.

4 голосов
/ 27 марта 2009

Как и Дэн, я смотрел на Стандарт без определенных результатов. Я попробовал ваш код с онлайн-компилятором Comeau (считается самым стандартным в мире) и получил:

строка 3: ошибка: не указано полное имя разрешено в декларации участника

Если вы заинтересованы в этом, я предлагаю опубликовать вопрос в группе новостей comp.lang.c ++. Moderated , поскольку там гораздо больше юристов по языку C ++, чем здесь. 1011 *

...