首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ 成員函數前加類名(MY::print)在 g++ 報錯而 VS 通過:標準合規性差異

     編輯:程式設計疑難解答

錯誤代碼

class MY {
public:
    void MY::print() { // ❌ 類內定義前加 MY::
        cout << "sdjflsdj" << endl;
    }
};

編譯器表現差異

編譯器結果依據標準
g++ (GCC)error: extra qualification ‘MY::’ on member ‘print’嚴格遵循 C++ 標準 [class.mfct]/2:類內定義**不得**帶類名限定。
MSVC (VS2012+)通過(預設延伸性)歷史相容性考量,視為非標準延伸,/permissive- 會報錯。

標準規定

  • 類內定義:void print() { ... } —— **不可**加 MY::。
  • 類外定義:void MY::print() { ... } —— **必須**加 MY::。

正確寫法

// 1. 類內內聯定義(推薦簡單函數)
class MY {
public:
    void print() { cout << "sdjflsdj" << endl; }
};

// 2. 類外定義(推薦複雜函數,分離介面與實作)
class MY {
public:
    void print();
};
void MY::print() { cout << "sdjflsdj" << endl; }

如何讓 g++ 兼容舊代碼(不推薦)

g++ -std=c++14 -fpermissive main.cpp  # 降級為警告並通過

但**強烈建議修正代碼符合標準**,而非依賴編譯器寬容模式。

總結

**類內定義成員函數時,前面加類名是非標準寫法**。g++ 嚴格遵循標準報錯,MSVC 為兼容舊代碼預設允許。跨平台專案請啟用 /permissive- (MSVC) 或 -pedantic-errors (GCC/Clang) 強制標準合規,並在代碼審查階段統一修正。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved