ใน C++ Function Overloading ต้องการ Parameter List ที่แตกต่างกัน (Signature) โดย Return Type ไม่รวมอยู่ใน Signature บทความนี้สรุปกรณีที่ Overload ไม่ได้ แม้ Parameter ดูต่างกัน
กรณีที่ Overload ไม่ได้ (Compile Error: Redefinition)
1. แตกต่างกันแค่ Return Type
int func() { return 5; }
char func() { return 'd'; } // Error: Redefinition
// Signature เหมือนกัน: func()
2. Member Function: Static vs Non-static เหมือน Parameter
class MyClass {
static void func(int x); // Error
void func(int x); // Error: Same signature
};
// Static ไม่ใช่ส่วนหนึ่งของ Signature สำหรับ Overloading
3. Pointer vs Array Parameter (Decay to Pointer)
void func(int* arr) { } // int*
void func(int arr[]) { } // Error: int[] Decay เป็น int* ใน Parameter
void func(int arr[10]) { } // Error: ขนาด Array ถูก Ignore
// ทั้งสาม Signature เหมือนกัน: func(int*)
4. Top-level CV-Qualifiers (const/volatile บน Parameter โดยตรง)
void func(int x) { }
void func(const int x) { } // Error: Top-level const ถูก Ignore
void func(volatile int x) { } // Error
// Parameter Passing By Value: const/volatile บน Parameter เอง ไม่ส่งผลต่อ Signature
แต่: const int& vs int& ต่างกัน (Reference to Const vs Non-const)
5. Default Arguments
void func(int a, int b) { }
void func(int a, int b = 50) { } // Error: Default Arg ไม่อยู่ใน Signature
// เรียก func(10) -> Ambiguous
กรณีที่ Overload ได้ (เพื่อเปรียบเทียบ)
| กรณี | ตัวอย่าง | เหตุผล |
|---|---|---|
| Parameter Type ต่างกัน | f(int) vs f(double) | Type ต่างกันจริง |
| จำนวน Parameter ต่างกัน | f(int) vs f(int, int) | Arity ต่างกัน |
| Reference Qualifier (C++11) | f() & vs f() && | Ref-Qualifier ต่างกัน |
| Const/Volatile บน Reference/Pointer | f(const int&) vs f(int&) | Qualifier บน Pointee/Referred Type |
| Array ขนาดต่างกัน (Reference to Array) | f(int (&)[10]) vs f(int (&)[20]) | Type ของ Array Reference ต่างกัน |
สรุป
Function Overloading ใน C++ ใช้ Parameter Type List (Signature) เพื่อแยกแยะ ไม่ได้ดู Return Type, Storage Class (static), Top-level CV-Qualifiers, Default Arguments, หรือ Array/Pointer Decay การเข้าใจกฎเหล่านี้ช่วยหลีกเลี่ยง Compile Error และออกแบบ API ที่ชัดเจน