2014-09-22 40 views
3

雖然重構了一些C++代碼,今天我得到了一些代碼,可以歸結爲以下不尋常的範圍解析操作

class x 
{ 
    public: 
    void x::y(); 
}; 

是否x::範圍解析運營商在這裏做任何事情,它是一個錯誤,或者是別的東西。我最好的猜測是它是一個自動完成遺留下來的人造物,但我很想知道我是否缺少任何東西。編譯器使用的是VS2010 SP1。

+1

我不認爲它應該在那裏。我認爲MS接受它。 – Niall 2014-09-22 13:48:08

+0

VS編譯器可以,但其他大多數編譯器都會拒絕。 – user1781290 2014-09-22 13:48:37

+2

也許有人從實現文件複製粘貼聲明,忘記刪除範圍解析運算符。這不應該編譯。 – dasblinkenlight 2014-09-22 13:48:42

回答

13

這是一個錯誤,大多數編譯器會拒絕它。

甲聲明符-ID 並無資格除了一個成員函數的定義或:例如,GCC says

prog.cpp:4:10: error: extra qualification ‘x::’ on member ‘y’ [-fpermissive] 
    void x::y(); 
     ^

冗餘限定符是由C++ 11 8.3/1不允許靜態數據成員在它的類之外,定義或顯式實例化一個名稱空間之外的名稱空間的函數或變量成員,或者在其名稱空間之外的顯式專用的定義,或者作爲成員的朋友函數的聲明另一個類或名稱空間。

這些例外都不適用於其類中的成員聲明。