Следующее, по-видимому, является шаблоном, используемым ZeroC ICE в коде, который он автоматически генерирует, что, как мне кажется, является способом, которым они создали синглтоны (не знаю, почему) для многих выпусков их инструмента сейчас. У различных компиляторов с этим проблем нет, пока сегодня я не обнаружил, что Visual Studio 2015 Update 1 (версия VS 14.0.24720.00, версия VC++ 19.00.23506) выдает ошибку. До обновления 1 в VS2015 тоже не было с этим проблем. Я не уверен, является ли это ошибкой (регрессией?) в компиляторе С++ VS2015 с обновлением 1 или плохим (не соответствующим стандартам) кодом С++, который другие компиляторы пропускают.
Вот пример шаблона кода:
class Foo {
protected:
virtual ~Foo() {}
friend class Foo_init;
};
class Foo_init {
public:
Foo init;
};
static Foo_init staticFooInit;
VS2015 Update 1 выдает следующие ошибки:
example.cpp(13): error C2248: 'Foo::~Foo': cannot access protected member declared in class 'Foo'
example.cpp(3): note: see declaration of 'Foo::~Foo'
example.cpp(1): note: see declaration of 'Foo'
Я нашел один (пока без ответа) Сообщение на форуме ZeroC ICE , похоже, связано с этим, но в остальном я не нашел в своем поиске в Google ничего, что убедило бы меня, является ли это проблемой компилятора или плохим кодом. Я признаю, что не очень хорошо знаю ZeroC ICE, и при этом я не использую дружественные классы C++ достаточно, чтобы иметь глубокое понимание того, что вы можете и не можете делать с ними. Я надеюсь, что кто-то более знающий может пролить свет на это.