Credevo di aver capito ricerca del nome molto bene (dopo aver visto diversi video su di esso e leggere un sacco), ma ho appena colpito questo caso:Perché il compilatore non prende il nome dello spazio dei nomi quando quelli interni non funzionano?
#include <iostream>
namespace test{
struct Id
{};
void do_something(const Id&){ std::cout << "Hello, World!" << std::endl; }
class Test
{
public:
void do_something() { std::cout << "WTF!" << std::endl; }
void run()
{
Id id;
do_something(id); // doesn't compile
}
};
}
int main()
{
test::Test my_test;
my_test.run();
}
La linea di punta non lo fanno compilare (su GCC4.8 e VC11U2) perché tenta di utilizzare la funzione membro test::Test::do_something()
anziché lo spazio dei nomi test::do_something(const Id&)
che sembra l'unico candidato possibile.
A quanto pare il nome della funzione membro nasconde i nomi con ambito spazio nomi che mi sorprende perché ricordo di aver usato codice simile in altri contesti senza questo problema di spawning (ma le condizioni potrebbero essere molto diverse alla fine).
La mia domanda è: questi compilatori confermano lo standard?
(ricerca del nome è molto difficile da capire leggendo il documento uniforme, purtroppo, quindi ho bisogno di conferme di esperti)
No, no. La ricerca del nome è facile. È solo [una semplice piccola formula.] (Https://twitter.com/JamesMcNellis/status/336513318686695424) –
'do_something' non è globale; è nello spazio dei nomi 'test'. – chepner
@chepner Truem fammi risolvere questo problema. – Klaim