использование объявления не может ссылаться на члена класса - PullRequest
0 голосов
/ 25 октября 2019

По существу, существует класс Foo, определенный в пространстве имен np:

//Foo.h
namespace np {

    class Foo {
        public:
          static void static_member();
         ...
        }
...
}

Я хотел сослаться на статический член в других источниках, скажем src.cc

//src.cc
#include "Foo.h"

using np::Foo::static_member;
...
static_member()
...

после запуска компилятора он жаловался:

 error: using declaration cannot refer to class member

Однако это сработало, когда я изменил строку на np::Foo::static_member(). Итак, как правильно опустить префиксы бесконечной области видимости?

Ответы [ 3 ]

2 голосов
/ 25 октября 2019

Я не уверен, каков ваш вариант использования, но я бы пошел одним из двух способов (или, может быть, три?):

1), если это применимо, попробуйте переместить этот статический метод в пространство имен- поскольку он статический, это может сработать для вас (в случаях, когда вам нужно передать эту вещь как некоторый шаблонный класс, этот подход не будет работать). Посмотрите мнение других людей по этому поводу:

Пространство имен + функции и статические методы в классе https://softwareengineering.stackexchange.com/questions/134540/are-utility-classes-with-nothing-but-static-members-an-anti-pattern-in-c

namespace np
{
  void static_non_member();
} // namespace np

// .. in .cpp, should be fine to do this
{
  using namespace np;
  static_non_member();
}

2) использование объявлений хорошо работает с классами, поэтому выможет, по крайней мере, уменьшить количество написанного:

// assume same hpp
// cpp
#include "Foo.h"

using Foo = np::Foo;

Foo::static_member();

3) бонусный раунд: сохранить указатель на эту функцию

#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
2 голосов
/ 25 октября 2019

Итак, как правильно пропустить префиксы бесконечной области действия?

Нет способа. За пределами области действия класса using объявления могут ссылаться на вложенные типы в классах, но не на элементы данных, см. здесь .

Самое короткое, что вы можете получить, этолибо

using namespace np;
Foo::static_member();

, либо используйте указатель на член, который короче, но также немного запутан:

auto static_member = &np::Foo::static_member;
static_member();
0 голосов
/ 25 октября 2019

Вам не нужно добавлять using np::Foo::static_member;

Вы можете использовать любую функцию static, если вы включили Foo.h и если эта функция public

Например:

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