1
votes

l'utilisation d'une déclaration ne peut pas faire référence à un membre de classe

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?


1 commentaires

Il n'y a pas moyen à moins que Foo soit un espace de noms, pas un type class (ou struct ). 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 de np :: Foo


3 Réponses :


2
votes

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();

2 commentaires

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.



0
votes

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();
}


0 commentaires

2
votes

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


0 commentaires