2009-10-08 12 views
10

devo usare un'API fornita da una DLL con un'intestazione simileUtilizzo di una classe in uno spazio dei nomi con lo stesso nome?

namespace ALongNameToType { 
    class ALongNameToType { 
     static void Foo(); 
    } 
} 

C'è un modo per utilizzare ALongNameToType :: ALongNameToType :: Foo senza dover digitare ALongNameToType :: ALongNameToType ogni volta? Ho provato a utilizzare using namespace ALongNameToType ma ho ottenuto errori di simboli ambigui in Visual Studio. Cambiando il nome del namespace o rimuovendolo mi danno errori di linker.

+0

Eventuali duplicati di [classi e spazi dei nomi che condividono lo stesso nome in C++] (http://stackoverflow.com/questions/4070915/classes-and-namespaces -sharing-the-same-name-in-c) – jww

risposta

20

Non so che cosa è ambiguo, ma puoi evitare tutti i conflitti con altre funzioni Foo come questa:

namespace ALongNameToType { 
    struct ALongNameToType { 
     static void Foo(); 
    }; 
} 

typedef ALongNameToType::ALongNameToType Shortname; 

int main() { 
    Shortname::Foo(); 
} 
+0

Ho dimenticato completamente typedef ... +1 – AraK

+0

in realtà non devi usare struct invece di clas s, vero? – 2am

+2

@ 2am: non è necessario, è possibile scrivere 'class ALongNameToType {public: static void Foo(); }; 'se preferisci, ma il codice nella domanda deve essere corretto in un modo o nell'altro. Di solito uso 'struct' per i tipi senza membri non pubblici. Si dovrebbero definire le condizioni per l'uso di 'struct' in qualunque guida di stile si applichi al codice. Alcune persone usano 'struct' specificatamente per i tipi POD, o specificatamente per i tipi la cui compilazione verrà compilata come C, o specificatamente per i tipi senza costruttori definiti dall'utente o funzioni membro, o semplicemente usarla a casaccio per tipi che considerano" semplici ";) –

3
namespace myns = ALongNameToType; 

Sembra che non si può alias un ambito classe come questa:

// second ALongNameToType is a class 
namespace myns = ALongNameToType::ALongNameToType; 

Forse si potrebbe alias la funzione è di per sé:

namespace foo 
{ 
class foo 
{ 
public: 
    static void fun() 
    { 

    } 
}; 
} 

int main() 
{ 
void (*myfunc)() = foo::foo::fun; 

myfunc(); 
} 
3
using ALongNameToType::ALongNameToType::Foo; 

se si desidera utilizzarlo come Foo().

+0

Funziona per me su gcc4. – Bill

+3

Sfortunatamente non funziona per me in Visual Studio 2008 'errore C2885: 'ALongNameToType :: ALongNameToType :: Foo': non una dichiarazione d'uso valida in ambito non-classe' – Steven

1

Esistono tre modi per utilizzare using. Uno è per un intero spazio dei nomi, uno è per cose particolari in uno spazio dei nomi, e uno è per una classe derivata che dice che non vuole nascondere qualcosa dichiarato/definito in una classe base. È possibile utilizzare il secondo di quelli:

using ALongNameToType::ALongNameToType 

Purtroppo questo non funziona per voi (a causa l'ambiguità dello spazio dei nomi e la classe con lo stesso nome). La combinazione di questo tipo di utilizzo con una risposta precedente dovrebbe sbarazzarsi delle ambiguità:

namespace alntt = ALongNameToType; 
using alntt::ALongNameToType; 

Ma una volta che hai rinominato lo spazio dei nomi, davvero non hanno bisogno dell'espressione using (a patto che si sta scrivendo comodo il (abbreviato) spazio dei nomi ogni volta che si utilizza la classe:

namespace alntt = ALongNameToType; 
alntt::ALongNameToType a; 
... 
+0

Questo mi dà l'errore C2874: using- dichiarazione causa una dichiarazione multipla di 'ALongNameToType :: ALongNameToType'' in Visual Studio 2008 – Steven

+0

Oh bene, è utile nei casi in cui non vi è ambiguità (ad es., "using std :: cout"). –

Problemi correlati