以下代码在clang上编译并运行正常,但在gcc上会出现“error: invalid use of non-static data member ‘Outer::a’”的错误:
#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一样失败并出现相同的错误。
您可以在此处尝试编译:
a
,找到了Outer::a
。如果您将a = 7
替换为Outer::a = 7;
,那么gcc也会编译它。我想知道(a)Outer::a = 7;
是否也是非法的,如果不是,它与a = 7
有何不同。 - Yakk - Adam Nevraumont