Следующее выглядит как шаблон, используемый ZeroC ICE в коде, который он автоматически генерирует, и мне кажется, что они сделали синглтоны (не уверены, почему) для многих выпусков своего инструмента. У разных компиляторов нет проблем с этим, пока я не обнаружил, что Visual Studio 2015 Update 1 (версия VS 14.0.24720.00, версия VС++ 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 Обновление 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 forum, которое, похоже, связано с этим, но в противном случае я не обнаружил в своем поиске Google ничего, что убеждает я ли это проблема компилятора или плохой код. Я признаю, что я не очень хорошо знаю ZeroC ICE и не использую классы класса С++, чтобы иметь глубокое понимание того, что вы можете и чего не можете с ними делать. Я надеюсь, что кто-то более осведомленный может пролить свет на него.