En gros, il y a une classe Foo
définie dans l'espace de noms np
:
error: using declaration cannot refer to class member
Je voulais référencer le membre statique dans d'autres sources , dites src.cc
//src.cc #include "Foo.h" using np::Foo::static_member; ... static_member() ...
après le lancement du compilateur, il s'est plaint:
//Foo.h namespace np { class Foo { public: static void static_member(); ... } ... }
Cependant , cela a fonctionné quand j'ai changé la ligne en np :: Foo :: static_member ()
. Alors, quels sont les moyens appropriés pour omettre les préfixes de portée interminable?
3 Réponses :
Alors, quelles sont les bonnes façons d'omettre les préfixes interminables de portée?
Il n'y a aucun moyen. En dehors de la portée de la classe, les déclarations
using
peuvent faire référence à des types imbriqués dans les classes, mais pas aux membres de données, voir ici .Le plus court que vous pouvez obtenir est soit
auto static_member = &np::Foo::static_member; static_member();ou choisissez un pointeur vers un membre, qui est plus court mais aussi un peu plus déroutant:
using namespace np; Foo::static_member();
Bonjour, j'ai essayé decltype (np :: Foo :: static_member) * static_member
(ce qui, je pense, est le même que votre deuxième solution de contournement), la compilation a réussi mais le programme s'est écrasé à l'appel de static_member ()
; Je travaille avec Android NDK, et backtrace n'a rien dit sur ce crash: (
Si vous utilisez la version decltype
, vous devez vous assurer que le pointeur vers le membre est initialisé. Le crash que vous voyez est probablement que vous essayez d'appeler une fonction via un pointeur qui ne pointe pas vers un emplacement valide dans la mémoire.
Vous n'avez pas besoin d'ajouter en utilisant np :: Foo :: static_member;
Vous pouvez utiliser n'importe quelle fonction static
si vous avez inclus Foo. h
et si la fonction est public
Par exemple:
// Foo.h namespace np { Class Foo { public: static void PrintHello(); } } // Foo.cpp #include "Foo.h" #include <iostream> void np::Foo::PrintHello() { printf("Hello World!\n"); } // main.cpp #include "Foo.h" int Main() { np::Foo::PrintHello(); }
Je ne sais pas quel est votre cas d'utilisation, mais j'irais de deux manières (ou peut-être trois?):
1) si cela s'applique, essayez de déplacer cette méthode statique dans un espace de noms - car c'est statique cela peut fonctionner pour vous (dans les cas où vous devez passer cette chose comme une sorte de classe basée sur un modèle, cette approche ne fonctionnera pas). Voir l'opinion des autres à ce sujet:
Namespace + fonctions versus méthodes statiques sur une classe https: // softwareengineering.stackexchange.com/questions/134540/are-utility-classes-with-nothing-but-static-members-an-anti-pattern-in-c
#include <type_traits> using FunctionPtrT = std::add_pointer<void()>::type; FunctionPtrT static_ptr = &Foo::static_member; // Foo::static_member(); static_ptr(); // name this whatever you wish
Il n'y a pas moyen à moins que
Foo
soit un espace de noms, pas un typeclass
(oustruct
). L'appel de la fonction devrait également être dans une autre fonction.np :: Foo :: static_member ()
peut être appelé non qualifié dans une fonction membre denp :: Foo