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++ -std=c++14 -fpermissive main.cpp # 降級為警告並通過
但**強烈建議修正代碼符合標準**,而非依賴編譯器寬容模式。
**類內定義成員函數時,前面加類名是非標準寫法**。g++ 嚴格遵循標準報錯,MSVC 為兼容舊代碼預設允許。跨平台專案請啟用 /permissive- (MSVC) 或 -pedantic-errors (GCC/Clang) 強制標準合規,並在代碼審查階段統一修正。