定义成员函数时编译错误,但仅在GCC中编译

时间:2015-07-05 15:55:30

标签: c++ gcc language-lawyer using-declaration

以下程序编译时没有错误与MSVS,clang和GCC:

class A;

namespace Y {
    using ::A;
    class A {};
}

int main() {}

现在让我们定义一个成员函数。现在它仍然可以编译MSVS和clang,但不能与GCC编译:

class A;

namespace Y {
    using ::A;
    class A { void f() {} };
}

int main() {}

GCC提供以下错误消息:

  • prog.cc:5:22:错误:定义' void A :: f()'不在名称空间中包含' A' [-fpermissive]

为什么?这是GCC中的错误吗?

如果该程序的第二个版本违反了c ++标准的规则,它违反了什么规则以及为什么MSVS和clang没有为该违规行为提供诊断消息?

这是一个c ++标准含糊不清的案例吗?

从错误消息中看起来GCC错误地认为我们违反了以下规则:

我们没有违反此规则,因为成员函数定义在类定义中。我的理论是,海湾合作委员会混淆了宣言类A;在全局命名空间中,在命名空间Y中有类定义类A {...}。我认为我们在GCC中有一个错误。

通过GCC,他们宣布同一个实体。通过观察在程序的第一个版本中可以看出,在使用GCC进行编译时,可以使用:: A作为main中的完整类型。 MSVS也是如此。然而,对于Clang,他们宣布了不同的实体。这种差异可能是因为c ++标准的模糊性。无论这种含糊不清,我们显然都没有违反http://eel.is/c++draft/class.mfct#2。这个规则很清楚。

相关问题:Class declaration in same scope as using declaration compiles in GCC but not MSVS

1 个答案:

答案 0 :(得分:4)

根据c ++标准,这两个程序都是不正确的。这是因为与相关问题相同的原因:

Class declaration in same scope as using declaration compiles in GCC but not MSVS

所有编译器都应该在两种情况下都给出编译错误:所以这表明MSVS,clang和GCC中存在错误。

clang中的错误已经确认并修复:https://llvm.org/bugs/show_bug.cgi?id=24030

GCC为第二个程序提供奇怪的错误消息的原因是当它无法检测到第一个和第二个程序中出现的错误时会感到困惑。