11
votes

Utiliser une classe dans un espace de noms avec le même nom?

Je dois utiliser une API fournie par une DLL avec une en-tête comme celle-ci

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


4 Réponses :


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

  }
 };
}

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

 myfunc();
}

0 commentaires

23
votes

Je ne sais pas ce qui est ambigu, mais vous pouvez éviter tous les conflits avec d'autres fonctions FOO comme ceci:

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

typedef ALongNameToType::ALongNameToType Shortname;

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


3 commentaires

J'ai oublié Typef totalement ... +1


Vous n'avez pas vraiment d'utiliser la structure au lieu de la classe, n'est-ce pas ??


@ 2h du matin: vous n'êtes pas obligé, vous pouvez écrire Classe de la classe {Public: Statique Void Foo (); }; si vous préférez, mais le code dans la question doit être corrigé d'une manière ou d'une autre. J'utilise généralement struct pour types sans membres non publics. Vous devez définir les conditions d'utilisation de struct dans le guide de style s'applique au code. Certaines personnes utilisent struct spécifiquement pour les types de pod, ou spécifiquement pour les types dont la définition compilera en tant que C, ou spécifiquement pour les types sans constructeurs ou fonctions membres définies par l'utilisateur, ou simplement l'utiliser au hasard pour des types auxquels ils considèrent. "Facile" ;-)



3
votes
using ALongNameToType::ALongNameToType::Foo;
if you just want to use it as Foo().

1 commentaires

Malheureusement, cela ne fonctionne pas pour moi dans Visual Studio 2008 Erreur C2885: "EnfineappineToType :: EnfinieToType :: FOO ': Pas une déclaration valide à l'aide de la déclaration de classe



1
votes

Il existe trois façons d'utiliser en utilisant code>. L'une est pour tout un espace de noms entier, on est destiné à des choses particulières dans un espace de noms, et on est pour une classe dérivée disant qu'il ne veut pas cacher quelque chose déclaré / défini dans une classe de base. Vous pouvez utiliser la seconde de celles suivantes:

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


2 commentaires

Cela me donne Erreur C2874: Utiliser-la déclaration provoque une déclaration multiple de "enfance" "au fil de la photo" dans Visual Studio 2008


Oh bien, c'est utile dans les cas où il n'y a pas d'ambiguïté (par exemple, "Utilisation de std :: Cout").