Следующий код компилируется и работает в clang, но завершается с ошибкой «ошибка: недопустимое использование элемента не статических данных« Outer :: a »» в gcc:
#include <functional>
#include <vector>
#include <assert.h>
#include <iostream>
#include <memory>
class Outer
{
public:
bool a = false;
virtual void f() = 0;
template <typename T>
class Inner : public T
{
public:
virtual void f() override
{
a = true; // Note: accessed through inheritance, not through outer scope
}
};
};
struct Foo : Outer { };
int main()
{
Outer::Inner<Foo> f;
f.f();
}
Добавление «this-> a» к внутреннему классу заставляет его работать на обоих компиляторах, но мне интересно, каково правильное поведение и что стандарты говорят об этом.
Интересно, что приведенный выше код работает как часть большей базы кода в VS2017 на работе, но когда я пробую его дома с VS2017 в изоляции, он завершается с той же ошибкой, что и GCC.
Вы можете попробовать скомпилировать его здесь: