Перезапись видимости включенных типов данных для подавления «предупреждения: объявлено с большей видимостью, чем тип его ⇐ C++
Перезапись видимости включенных типов данных для подавления «предупреждения: объявлено с большей видимостью, чем тип его
При компиляции программы на C++ я получаю сообщение об ошибке:
В файле, включенном в pybind11_error.cpp:33: pybind11_error.h:38:7: предупреждение: «MyClass» объявлен с большей видимостью, чем тип его поля «MyClass::py_mod» [-Wattributes] 38 | класс МойКласс { Мой pybind_error.h выглядит так:
#include класс МойКласс { публика: недействительный инициализации (); частный: интервал ан_int; pybind11::module_ py_mod; }; И pybind_error.cpp выглядит так:
#include "pybind11_error.h" недействительный MyClass::init() { py_mod = pybind11::module_::import("numpy"); } интервал основной() { pybind11::initialize_interpreter(); МойКласс мой_класс; мой_класс.инит(); pybind11::finalize_interpreter(); вернуть 0; } Я делаю два замечания:
[*]Мне кажется, что это предупреждение очевидно верно и также отражает мои намерения. Я намерен, чтобы py_mod был закрытым членом и, следовательно, был недоступен за пределами класса. Публичные функции должны быть доступны вне класса. Если только мое понимание того, что означает «публичный» и «частный», не совсем неверно, код должен быть написан именно так, чтобы достичь того, чего я хочу, и поэтому это не должно вызывать предупреждения. [*]Поскольку предупреждение не инициируется an_int, мне кажется, что это связано с использованием библиотеки pybind11.
Следуя мысли, изложенной в пункте (2), я просмотрел документацию по pybind11::module_, которую можно найти на веб-сайте pybind11. Это заставляет меня подозревать, что виновником является ключевое слово public в объявлении:
class Module_: общедоступный объект Итак, мой вопрос, если я правильно понял проблему, могу ли я каким-то образом изменить видимость pybind11::module_, чтобы устранить предупреждение? (разумеется, без изменения исходного кода библиотеки Pybind11)
Я это уже пробовал:
pybind11::module_ __attribute__((visibility ("скрытый"))) py_mod; что создает предупреждение: атрибут «видимость» игнорируется. Для меня это интуитивно понятно, поскольку мне не нужно указывать, что частный член должен быть скрыт.
РЕДАКТИРОВАТЬ: Как обсуждалось в комментариях, добавление опции компиляции:
-fvisibility=скрытый Решает проблему. Однако это относится ко всем проектам, что может быть не идеально. Обратите внимание, что первая строка pybind_error.h изменена на:
#pragma GCC push видимости (скрыто) #include #pragma Всплывающее окно видимости GCC создает другую ошибку.
При компиляции программы на C++ я получаю сообщение об ошибке:
В файле, включенном в pybind11_error.cpp:33: pybind11_error.h:38:7: предупреждение: «MyClass» объявлен с большей видимостью, чем тип его поля «MyClass::py_mod» [-Wattributes] 38 | класс МойКласс { Мой pybind_error.h выглядит так:
#include класс МойКласс { публика: недействительный инициализации (); частный: интервал ан_int; pybind11::module_ py_mod; }; И pybind_error.cpp выглядит так:
#include "pybind11_error.h" недействительный MyClass::init() { py_mod = pybind11::module_::import("numpy"); } интервал основной() { pybind11::initialize_interpreter(); МойКласс мой_класс; мой_класс.инит(); pybind11::finalize_interpreter(); вернуть 0; } Я делаю два замечания:
[*]Мне кажется, что это предупреждение очевидно верно и также отражает мои намерения. Я намерен, чтобы py_mod был закрытым членом и, следовательно, был недоступен за пределами класса. Публичные функции должны быть доступны вне класса. Если только мое понимание того, что означает «публичный» и «частный», не совсем неверно, код должен быть написан именно так, чтобы достичь того, чего я хочу, и поэтому это не должно вызывать предупреждения. [*]Поскольку предупреждение не инициируется an_int, мне кажется, что это связано с использованием библиотеки pybind11.
Следуя мысли, изложенной в пункте (2), я просмотрел документацию по pybind11::module_, которую можно найти на веб-сайте pybind11. Это заставляет меня подозревать, что виновником является ключевое слово public в объявлении:
class Module_: общедоступный объект Итак, мой вопрос, если я правильно понял проблему, могу ли я каким-то образом изменить видимость pybind11::module_, чтобы устранить предупреждение? (разумеется, без изменения исходного кода библиотеки Pybind11)
Я это уже пробовал:
pybind11::module_ __attribute__((visibility ("скрытый"))) py_mod; что создает предупреждение: атрибут «видимость» игнорируется. Для меня это интуитивно понятно, поскольку мне не нужно указывать, что частный член должен быть скрыт.
РЕДАКТИРОВАТЬ: Как обсуждалось в комментариях, добавление опции компиляции:
-fvisibility=скрытый Решает проблему. Однако это относится ко всем проектам, что может быть не идеально. Обратите внимание, что первая строка pybind_error.h изменена на:
#pragma GCC push видимости (скрыто) #include #pragma Всплывающее окно видимости GCC создает другую ошибку.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Каковы последствия подавления предупреждения PendingModelChangesWarning EF Core?
Anonymous » » в форуме C# - 0 Ответы
- 23 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Каковы последствия подавления предупреждения PendingModelChangesWarning EF Core?
Anonymous » » в форуме C# - 0 Ответы
- 40 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Каковы последствия подавления предупреждения PendingModelChangesWarning EF Core?
Anonymous » » в форуме C# - 0 Ответы
- 29 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Каковы последствия подавления предупреждения PendingModelChangesWarning EF Core?
Anonymous » » в форуме C# - 0 Ответы
- 16 Просмотры
-
Последнее сообщение Anonymous
-