Текущий ответ на этот вопрос просто неверный, он говорит:
В C ++ нельзя называть функцию тем же именем, что и класс / struct / typedef
Допускается скрытие имени класса функцией, если мы перейдем к черновому стандарту Pre C ++ 11 раздел 3.3.7
Скрытие имени В нем говорится:
Имя класса (9.1) или имя перечисления (7.2) можно скрыть по имени
объекта, функции или перечислителя, объявленного в той же области видимости. Если
имя класса или перечисления и объект, функция или перечислитель
объявлены в той же области (в любом порядке) с тем же именем,
имя класса или перечисления скрыто везде, где объект, функция или
имя перечислителя видно.
Так что тот факт, что у вас есть функция и класс с именем Player
, не является проблемой, фактически следующий код действителен:
class Player
{
} ;
Player* Player() ;
и мы можем использовать разработанный спецификатор типа , чтобы скрыть тип класса.
Насколько я могу судить, это нарушает раздел 3.3.6
Область действия класса Абзац 2
, в котором говорится:
Имя N, используемое в классе S, должно ссылаться на то же объявление в его
контекст и при переоценке в завершенном объеме S. Нет
Диагностика необходима для нарушения этого правила.
Таким образом, в этом случае Player
меняет значение с класс на функцию , мне не ясно, было ли это так строго, но я вижу, как это можно прочитать сюда. Похоже, что это сообщение gcc
использует, когда обнаруживает это нарушение, как мы видим из аналогичного вопроса .
Использование разработанного спецификатора типа предотвращает изменение значения:
class Player* Player() const ;