C++: предупреждение: '…' объявленный с большей видимостью, чем тип ее поля' …:: <анонимный>'

Я получаю эти два предупреждения (с 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' объявил с большей видимостью, чем ее основное 'Действие'

В этом коде:

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


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

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

    /* ... */
}

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

Я уже скомпилировал тот же код с большим количеством других компиляторов (лязг, GCC 3.*, GCC 4.0, GCC 4.4, и т.д.), и никогда не получал предупреждения для этого кода.

7
задан Albert 13 May 2010 в 17:23
поделиться

3 ответа

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

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

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

-5
ответ дан 8 December 2019 в 01:41
поделиться

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

1
ответ дан 8 December 2019 в 01:41
поделиться

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

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

     #pragma Подтверждение видимости GCC (скрыто)
    struct MainLockDetector: Action {
    bool wait (время Uint32) {/ * ... * /}
    int handle () {/ * ... * /}
    };
    #pragma GCC visibility pop
    
  2. Используйте __ attribute__ ((visibility ("hidden"))) вот так.

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

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

4
ответ дан 8 December 2019 в 01:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: