C ++: предупреждение: '...' объявлено с большей видимостью, чем тип его поля '... :: <anonymous>' - PullRequest
6 голосов
/ 13 мая 2010

Я получаю эти два предупреждения (с GCC 4.2 на MacOSX):

/ Users / az / Programmierung / openlierox / build / Xcode /../../ src / main.cpp: 154: 0 /Users/az/Programmierung/openlierox/build/Xcode/../../ src / main.cpp: 154: предупреждение: startMainLockDetector () :: MainLockDetector 'объявлен с большей видимостью, чем тип его поля' startMainLockDetector () :: MainLockDetector :: '

/ Users / az / Programmierung / openlierox / build / Xcode /../../ src / main.cpp: 154: 0 /Users/az/Programmierung/openlierox/build/Xcode/../../ src / main.cpp: 154: предупреждение: 'startMainLockDetector () :: MainLockDetector' объявлено с большей видимостью, чем его базовое 'Action'

В этом коде:

struct Action {
    virtual ~Action() {}
    virtual int handle() = 0;
};


static void startMainLockDetector() {
    /* ... */

    struct MainLockDetector : Action {
         bool wait(Uint32 time) { /* ... */ }
         int handle() { /* ... */ }
    };

    /* ... */
}

Я не совсем уверен, что означают эти предупреждения (какая видимость?) И как их исправить. (Я действительно хочу, чтобы класс MainLockDetector был локальным только для этой функции.)

Я уже скомпилировал тот же код со многими другими компиляторами (clang, GCC 3. *, GCC 4.0, GCC 4.4 и т. Д.) И никогда не получал никаких предупреждений для этого кода.

Ответы [ 3 ]

4 голосов
/ 03 июля 2010

Чтобы решить эту проблему, попробуйте один из следующих.

  1. Используйте #pragma GCC visibility push() выражение, подобное этому.

    #pragma GCC visibility push(hidden)
    struct MainLockDetector : Action {
         bool wait(Uint32 time) { /* ... */ }
         int handle() { /* ... */ }
    };
    #pragma GCC visibility pop
    
  2. Используйте __attribute__ ((visibility("hidden"))) вот так.

    struct __attribute__ ((visibility("hidden"))) MainLockDetector : Action {
         bool wait(Uint32 time) { /* ... */ }
         int handle() { /* ... */ }
    };
    
  3. Добавить параметр командной строки -fvisibility = default.

Подробнее см. http://gcc.gnu.org/wiki/Visibility.

1 голос
/ 15 мая 2010

Кажется, проблема с общими библиотеками. Я предполагаю, что вы пишете общую библиотеку. Посмотрите на это объяснение . Попробуйте добавить параметр командной строки -fvisibility-inlines-hidden. Кажется, проблема в том, что gcc пытается экспортировать некоторые символы MainLockDetector (видимые для связывания исполняемых файлов и библиотек), тогда как Action не экспортируется (невидим для связывания исполняемых файлов и библиотек). Таким образом, видимость MainLockDetector действительно выше, чем видимость Action.

0 голосов
/ 13 мая 2010

Это потому, что вы забыли объявить наследство открытым.

    struct MainLockDetector : public Action {
         bool wait(Uint32 time) { /* ... */ }
         int handle() { /* ... */ }
    };

Это приводит к тому, что члены "Action" становятся частными. Но вы только что переопределили закрытый элемент Action как public (public по умолчанию в структуре), что может нарушить инкапсуляцию, а значит, и предупреждение.

...