2009-10-08 29 views
10

muszę używać API dostarczonego przez DLL z nagłówka jak tenUżywanie klasy w przestrzeni nazw o tej samej nazwie?

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

Czy istnieje sposób na wykorzystanie ALongNameToType :: ALongNameToType :: Foo bez konieczności wpisywania ALongNameToType :: ALongNameToType za każdym razem? Próbowałem używać using namespace ALongNameToType, ale dostałem niejednoznaczne błędy symboli w Visual Studio. Zmiana nazwy obszaru nazw lub usunięcie go powoduje błędy linkera.

+0

Możliwy duplikat [klas i nazw dzielących tę samą nazwę w C++] (http://stackoverflow.com/questions/4070915/classes-and-namespaces -podejmowanie-tego-imienia-in-c) – jww

Odpowiedz

20

nie wiem co niejednoznaczne, ale można uniknąć wszystkich konfliktów z innymi funkcjami Foo, takimi jak to:

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

typedef ALongNameToType::ALongNameToType Shortname; 

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

Zapomniałem typedef całkowicie ... +1 – AraK

+0

nie musisz używać struct zamiast clas s, prawda? – 2am

+2

@ 2am: nie musisz, możesz napisać 'class ALongNameToType {public: static void Foo(); }; 'jeśli wolisz, ale kod w pytaniu wymaga naprawy w taki czy inny sposób. Generalnie używam 'struct' dla typów bez niepublicznych członków. Powinieneś określić warunki korzystania z 'struct' w jakimkolwiek stylu dotyczącym kodu. Niektórzy używają 'struct' specyficznie dla typów POD lub specjalnie dla typów, których definicja będzie kompilować się jako C, lub specjalnie dla typów bez konstruktorów zdefiniowanych przez użytkownika lub funkcji składowych, lub po prostu używać go przypadkowo dla typów, które uważają za" proste ";) –

3
namespace myns = ALongNameToType; 

Wydaje się, że nie można aliasu zakresu klasy tak:

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

Może mógłbyś alias jaźń funkcja go:

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

    } 
}; 
} 

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

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

jeśli chcesz go używać jako Foo().

+0

Działa dla mnie na gcc4. – Bill

+3

Niestety to nie działa dla mnie w Visual Studio 2008 'błąd C2885: 'ALongNameToType :: ALongNameToType :: Foo': niepoprawna deklaracja użycia w zakresie nieklasowanym" – Steven

1

Istnieją trzy sposoby użycia using. Jeden dotyczy całej przestrzeni nazw, jedna dotyczy określonych rzeczy w przestrzeni nazw, a druga dotyczy klasy pochodnej, mówiąc, że nie chce ukryć czegoś zadeklarowanego/zdefiniowanego w klasie bazowej. Można użyć drugiej z tych:

using ALongNameToType::ALongNameToType 

Niestety to nie działa dla Ciebie (z powodu dwuznaczności nazw i klasy o tej samej nazwie). Łącząc ten rodzaj korzystania z poprzednią odpowiedź powinna pozbyć się wieloznaczności:

namespace alntt = ALongNameToType; 
using alntt::ALongNameToType; 

Ale kiedy już przemianowany nazw, to naprawdę nie trzeba oświadczenie using (tak długo, jak jesteś komfortowe pisanie The (skrócona) nazw za każdym razem użyć klasy:

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

Daje mi to 'błąd C2874: używanie- deklaracja powoduje wielokrotną deklarację "ALongNameToType :: ALongNameToType" w Visual Studio 2008 – Steven

+0

No cóż, jest to przydatne w przypadkach, w których nie ma dwuznaczności (np. "using std :: cout"). –

Powiązane problemy