2009-03-27 7 views
4

Простой вопрос, это действительный C++:Может ли имя метода 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++.

+0

Visual Studio (2008) принимает «Foo ::» –

+0

Да, я знаю ... Но я пытаюсь создать код с помощью g ++, и они часто отличаются тем, что они принимают, а не. Или, с моей точки зрения, VC, кажется, что-то принимает, а g ++ может быть разборчивым. :) – unwind

+0

Я бы сказал, что Foo :: был в лучшем случае ненужным и в худшем случае недействительным. Поэтому, на мой взгляд, вы совершенно оправданы в его удалении. – markh44

ответ

18

Я взглянул на стандарт, раздел 9.2 будет соответствующей частью. Я не так хорош в BNF, но я ничего не видел в BNF для членов класса, которые бы указали, что это разрешено. Идентификатор даже назван «unqualified-id» в BNF.

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

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

+0

Спасибо, это очень полезный ответ. Я проголосовал за это. Я задержусь некоторое время, прежде чем принимать, надеясь помочь людям чувствовать себя достаточно мотивированными, чтобы делать больше стандартов. :) – unwind

+0

Я не знаю, почему кто-то хотел бы использовать этот синтаксис, но я знаю, как он может волшебным образом появиться. Вроде. Скопируйте/вставьте из cpp в файл заголовка, чтобы встроить функцию и вот она. –

+0

Да, это то, что я подозреваю, тоже. – unwind

4

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

line 3: error: qualified name is not allowed in member declaration

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

+0

Спасибо! Я проголосовал за это, но теперь принял ответ Дэна, который, я думаю, имеет смысл и справедлив. – unwind

+0

Я также использую компилятор Comeau для стандартной проверки (и сообщения об ошибках, поскольку он более выразителен). Это хороший совет для всех: проверьте фрагменты кода с помощью Комо (онлайн или купите его, поскольку это довольно дешево) –

 Смежные вопросы

  • Нет связанных вопросов^_^