Этот код компилируется без каких-либо проблем, если test не вызывается, поэтому я заключаю, что c ++ позволяет создавать класс и функцию с одинаковым именем:
class test {};
void test() {}
int main() {
test an_instance_of_test;
}
ошибка:
<stdin>: In function 'int main()':
<stdin>:5:8: error: expected ';' before 'an_instance_of_test'
<stdin>:5:27: warning: statement is a reference, not call, to function 'test' [-Waddress]
И я знаю, что в первую очередь я не должен создавать такую однозначность, но, тем не менее, это может произойти в чужом коде, и я спрашиваю, есть ли выход из этого без изменения функции или определения класса.
Вы должны использовать разработанный спецификатор типа:
class test an_instance_of_test;
Как сказано в стандарте (§3.4.4):
уточненный тип Спецификатор (7.1.6.3) может использоваться для ссылки на ранее объявленный Имя_класса или же перечисление имя даже если имя было скрыто объявлением не-типа.
Поиск имени просто игнорирует любые имена не-типов:
Идентификатор ищется в соответствии с 3.4.1, но игнорируется любое нетипичное имя, которое было объявлено.
Других решений пока нет …