簡體   English   中英

定義成員函數時編譯錯誤,但僅在GCC中編譯

[英]Compile error when defining a member function, but only in GCC

以下程序在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進行編譯時,可以使用:: A作為main中的完整類型。 MSVS也是如此。 然而,對於Clang,他們宣布了不同的實體。 這種差異可能是因為c ++標准的模糊性。 無論這種模棱兩可,我們顯然都沒有違反http://eel.is/c++draft/class.mfct#2 這個規則很清楚。

相關問題: 與GCC中使用聲明編譯相同范圍內的類聲明,但不是MSVS

根據c ++標准,這兩個程序都是不正確的。 這是因為與相關問題相同的原因:

與在GCC中使用聲明編譯相同范圍內的類聲明但不在MSVS中編譯

在這兩種情況下,所有編譯器都應該給出編譯錯誤:所以這表明MSVS,clang和GCC中存在錯誤。

clang中的錯誤已經確認並修復: https ://llvm.org/bugs/show_bug.cgi?id = 24030

GCC為第二個程序提供奇怪錯誤消息的原因是,當它無法檢測到第一個和第二個程序中出現的錯誤時,它會感到困惑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM