Krugar ha la risposta corretta qui. Il nome che viene trovato ogni volta è il nome della classe iniettata.
Il seguente è un esempio che mostra almeno una ragione per cui il compilatore aggiunge il nome della classe iniettata:
namespace NS
{
class B
{
// injected name B // #1
public:
void foo();
};
int i; // #2
}
class B // #3
{
public:
void foo();
};
int i; // #4
class A :: NS::B
{
public:
void bar()
{
++i; // Lookup for 'i' searches scope of
// 'A', then in base 'NS::B' and
// finally in '::'. Finds #4
B & b = *this; // Lookup for 'B' searches scope of 'A'
// then in base 'NS::B' and finds #1
// the injected name 'B'.
}
};
Senza il nome iniettato regole di ricerca attuali raggiungerebbero alla fine l'ambito di inclusione di 'A' e trovere ':: B' e non 'NS :: B'. Dovremmo quindi utilizzare "NS :: B" ovunque in A quando volevamo fare riferimento alla classe base.
Un altro luogo che hanno iniettato nomi abituarsi sono con i modelli, in cui all'interno del modello di classe, il nome iniettato fornisce una mappatura tra il nome del modello e il tipo:
template <typename T>
class A
{
// First injected name 'A<T>'
// Additional injected name 'A' maps to 'A<T>'
public:
void foo()
{
// '::A' here is the template name
// 'A' is the type 'A<T>'
// 'A<T>' is also the type 'A<T>'
}
};
fonte
2009-08-12 08:25:12
Chiedo solo, ma stai usando foo e metodo nel tuo codice attuale? O stai solo facendo un aliasing con il codice con cui stai lavorando? – jkeys
Ho copiato quel codice come è in un progetto di singolo file e ho aggiunto una funzione principale vuota. Questo in realtà compila sotto gcc 4.3.3. – Matt
Posso confermare che questo effettivamente compila su g ++ senza avvisi (l'ho provato su 3.4.5 mingw) senza spazi dei nomi o altro. D'altra parte MSVC2008 lo rifiuta. Molto strano. –