ข้อผิดพลาด “Cout มีความคลุมเครือ” ใน C ++

Khx Phid Phlad Cout Mi Khwam Khlumkherux Ni C



บทความนี้เกี่ยวข้องกับข้อผิดพลาดที่ไม่ชัดเจนในภาษาการเขียนโปรแกรม C++ สถานการณ์ที่ไม่ชัดเจนจะปรากฏขึ้นเมื่อคอมไพเลอร์ไม่สามารถระบุวิธีการหรือตัวดำเนินการที่จะใช้กับงานที่แตกต่างกันได้ บางครั้ง เราใช้ฟังก์ชันพารามิเตอร์เดียวกันกับเนมสเปซเดียวกัน จากนั้นจึงกำหนด cout ในทั้งสองกรณี เมื่อเรารันโปรแกรม คอมไพลเลอร์จะสร้างข้อผิดพลาดที่ไม่ชัดเจนของ cout เนื่องจากคอมไพเลอร์ไม่เข้าใจความหมายของโค้ดนี้ ความคลุมเครือของศาลเกิดขึ้นเมื่อมีข้อขัดแย้งระหว่างเนมสเปซที่กำหนดหรือการประกาศฟังก์ชันหลายรายการภายในโปรแกรม

ตัวอย่างที่ 1:

นี่เป็นตัวอย่างข้อผิดพลาดที่ไม่ชัดเจนของ cout ซึ่งส่วนใหญ่เกิดขึ้นในการเขียนโปรแกรม C++ ที่นี่ เราจะดูว่าคอมไพลเลอร์สร้างข้อผิดพลาดที่ไม่ชัดเจนใน cout ได้อย่างไรเมื่อเราใช้เนมสเปซหลายอัน ข้อมูลโค้ดของตัวอย่างนี้มีการกล่าวถึงดังต่อไปนี้:







#รวม

เนมสเปซ แล็ปท็อป -

เป็นโมฆะ แสดง - - -

มาตรฐาน - ศาล - 'นี่คือเนมสเปซแล็ปท็อป' - มาตรฐาน - สิ้นสุด -

-

-

เนมสเปซ มือถือ -

เป็นโมฆะ แสดง - - -


มาตรฐาน - ศาล - 'นี่คือเนมสเปซบนมือถือ' - มาตรฐาน - สิ้นสุด -

-

-

ภายใน หลัก - - -

โดยใช้ เนมสเปซ แล็ปท็อป -
โดยใช้ เนมสเปซ มือถือ -

แสดง - - -

กลับ 0 -


-

ที่นี่ เราใช้โปรแกรมที่มีเนมสเปซสองตัวซึ่งกำหนดไว้ตามความต้องการของเรา เราต้องการแสดงสตริงบนหน้าจอ ผลลัพธ์ของรหัสนี้แนบมาดังต่อไปนี้:





เมื่อเรียกใช้โค้ด จะเกิดข้อผิดพลาดเกี่ยวกับสถานการณ์ที่ไม่ชัดเจน ข้อผิดพลาดเกิดขึ้นเนื่องจากเมื่อคอมไพเลอร์อ่านโค้ด คอมไพเลอร์ไม่ได้รับอินพุตที่ชัดเจนจากฝั่งผู้ใช้ เราใช้การประกาศเนมสเปซหลายรายการในโค้ดของเรา ในโค้ดทั้งหมด เราใช้วิธี 'display' เพื่อแสดงผลลัพธ์บนหน้าจอเท่านั้น คอมไพเลอร์ไม่รู้ว่าวิธีการแสดงผลใดเกี่ยวข้องกับเนมสเปซใด เราจำเป็นต้องทำให้โค้ดเรียบง่ายและชัดเจนเพื่อให้คอมไพเลอร์เข้าใจขั้นตอนต่างๆ ได้อย่างง่ายดายโดยไม่ทำให้โค้ดคลุมเครือ





วิธีแก้ไขข้อผิดพลาดนี้คือการเรียกเมธอดที่มีเนมสเปซที่เกี่ยวข้องในฟังก์ชันหลักเพื่อให้คอมไพลเลอร์มีความเข้าใจมากขึ้น เราระบุอย่างชัดเจนว่าเราต้องการเรียกใช้เนมสเปซเมธอดใดในส่วนการดำเนินการหลักของเรา

#รวม

เนมสเปซ แล็ปท็อป -

เป็นโมฆะ แสดง - - -


มาตรฐาน - ศาล - 'นี่คือเนมสเปซแล็ปท็อป' - มาตรฐาน - สิ้นสุด -

-

-

เนมสเปซ มือถือ -

เป็นโมฆะ แสดง - - -

มาตรฐาน - ศาล - 'นี่คือเนมสเปซบนมือถือ' - มาตรฐาน - สิ้นสุด -

-

-

ภายใน หลัก - - -

โดยใช้ เนมสเปซ แล็ปท็อป -
โดยใช้ เนมสเปซ มือถือ -
แล็ปท็อป - แสดง - - -
กลับ 0 -


-

ที่นี่ เราสามารถเชื่อมโยงเมธอด display() กับเนมสเปซ 'แล็ปท็อป' ในฟังก์ชันหลักดังที่เห็นในภาพหน้าจอก่อนหน้า ตอนนี้รันโปรแกรม ผลลัพธ์จะแสดงบนหน้าต่างคอนโซล



ตัวอย่างที่ 2:

สถานการณ์นี้เกี่ยวข้องกับข้อผิดพลาดที่ไม่ชัดเจนของ cout ใน C ++ คอมไพเลอร์แสดงข้อผิดพลาดเมื่อไม่เข้าใจโฟลว์การดำเนินการ ข้อมูลโค้ดของตัวอย่างนี้แนบมาดังต่อไปนี้:

#รวม

เนมสเปซ ภาษา -

เป็นโมฆะ พิมพ์ - ภายใน ฉัน - -

มาตรฐาน - ศาล - 'เนมสเปซของภาษา C: ' - ฉัน - มาตรฐาน - สิ้นสุด -

-

-

เนมสเปซ ชวา -

เป็นโมฆะ พิมพ์ - ภายใน เจ - -

มาตรฐาน - ศาล - 'เนมสเปซของภาษาจาวา: ' - เจ - มาตรฐาน - สิ้นสุด -

-

-

โดยใช้ เนมสเปซ ภาษา -

โดยใช้ เนมสเปซ ชวา -

ภายใน หลัก - - -

พิมพ์ - 5 - -
กลับ 0 -


-

ในโค้ดนี้ เรากำหนดส่วนหัวของไลบรารีที่จำเป็นทั้งหมด เราสร้างเนมสเปซสองอันเพื่อวัตถุประสงค์ที่แตกต่างกัน ในเนมสเปซ 'ภาษา' เรากำหนดวิธีการ 'พิมพ์' ที่รับค่าจำนวนเต็มจากผู้ใช้ ในฟังก์ชัน 'พิมพ์' เราต้องการแสดงค่าที่ผู้ใช้ส่งผ่านบนหน้าจอคอนโซล เราแสดงผลที่ต้องการโดยใช้สตรีม 'cout' ในโค้ดของเรา หลังจากนั้นเรากำหนดเนมสเปซอื่นที่มีชื่อว่า 'Java'

ในเนมสเปซ “Java” นี้ เราใช้วิธี “print” อีกครั้งเพื่อแสดงค่าที่ผู้ใช้ส่งผ่านโดยใช้ “cout” เราเรียกเนมสเปซทั้งสองสำหรับการใช้งานในฟังก์ชันหลักของเราเพื่อรับเอาต์พุตที่ต้องการบนหน้าต่างคอนโซลในภาษา C ++ ในฟังก์ชัน 'main' เราเรียกฟังก์ชัน 'print()'overloaded เพื่อแสดงค่าที่ส่งผ่านบนหน้าจอคอนโซล

คลิกที่ตัวเลือก 'execute' จากเมนูหลักและเลือกตัวเลือก 'compile & run' ข้อผิดพลาดเกี่ยวกับความกำกวมเกิดขึ้นในการดำเนินการโค้ดนี้ ภาพหน้าจอข้อผิดพลาดแนบมาดังนี้:

ข้อผิดพลาดนี้บ่งชี้ว่าคอมไพลเลอร์สับสนเกี่ยวกับฟังก์ชัน print() ที่โอเวอร์โหลดที่ถูกเรียก ข้อผิดพลาดนี้อยู่ในบรรทัดที่ 19 “พิมพ์ (5)” คอมไพเลอร์สับสนเกี่ยวกับเนมสเปซที่มีฟังก์ชันโอเวอร์โหลดนี้อยู่ ผู้เริ่มต้นมักจะติดอยู่ในข้อผิดพลาดประเภทนี้เกือบตลอดเวลา

มาแก้ไขข้อผิดพลาดนี้ซึ่งไม่ซับซ้อนในความเป็นจริง ข้อผิดพลาดที่คลุมเครือได้รับการแก้ไขอย่างง่ายดาย เราต้องระบุเนมสเปซพร้อมกับฟังก์ชันโอเวอร์โหลดในฟังก์ชัน 'หลัก' เพื่อให้คอมไพเลอร์มองเห็นและทำความเข้าใจได้ เช่นเดียวกับในโปรแกรมนี้ เราได้เพิ่ม “java::print(5)” นี้ลงในโค้ดที่มีอยู่ของเราตามที่กล่าวไว้ในส่วนต่อไปนี้:

#รวม

เนมสเปซ ภาษา -

เป็นโมฆะ พิมพ์ - ภายใน ฉัน - -

มาตรฐาน - ศาล - 'เนมสเปซของภาษา C: ' - ฉัน - มาตรฐาน - สิ้นสุด -

-

-

เนมสเปซ ชวา -

เป็นโมฆะ พิมพ์ - ภายใน เจ - -

มาตรฐาน - ศาล - 'เนมสเปซของภาษาจาวา: ' - เจ - มาตรฐาน - สิ้นสุด -

-

-

โดยใช้ เนมสเปซ ภาษา -

โดยใช้ เนมสเปซ ชวา -

ภายใน หลัก - - -

ชวา - พิมพ์ - 5 - -
กลับ 0 -


-

ตอนนี้ โปรแกรมทำงานได้อย่างสมบูรณ์แบบโดยไม่มีข้อผิดพลาดที่ไม่ชัดเจนใดๆ และแสดงเอาต์พุตบนหน้าจอคอนโซล ผลลัพธ์ของโปรแกรมนี้แนบมาดังต่อไปนี้:

ตัวอย่างที่ 3:

นี่เป็นตัวอย่างสุดท้ายและสุดท้ายที่เกี่ยวข้องกับข้อผิดพลาดที่เกิดขึ้นเนื่องจากปัญหาที่ไม่ชัดเจน คอมไพเลอร์ไม่สามารถรับผลลัพธ์ที่ถูกต้องได้ ข้อมูลโค้ดของตัวอย่างนี้แนบมาในส่วนต่อไปนี้เพื่อความเข้าใจที่ดีขึ้นของผู้ใช้:

ที่นี่เรากำหนดไลบรารีที่จำเป็น หลังจากนั้นเรากำหนดเนมสเปซที่มีคลาสที่เราต้องการแสดงสตริงบนหน้าต่างคอนโซล เราเรียกเนมสเปซที่กำหนดไว้นี้ในฟังก์ชัน 'main' ด้วยตัวแปร 'c' หลังจากนั้นเราเรียกเมธอด print() โดยใช้วัตถุเนมสเปซ เราแสดงสตริงอีกครั้งบนหน้าจอคอนโซลหลังจากการเรียกใช้เมธอด เอาต์พุตต้องเป็นทั้งสตริงและแสดงบนหน้าจอคอนโซล เมื่อเรารันโค้ดนี้ จะเกิดข้อผิดพลาดดังแสดงต่อไปนี้:

#รวม

โดยใช้ เนมสเปซ มาตรฐาน -

เนมสเปซ myNamespace -

ระดับ ศาล -
สาธารณะ -
เป็นโมฆะ พิมพ์ - - -


ศาล - 'ศาลที่กำหนดเอง' - มาตรฐาน - สิ้นสุด -

-

- -

-

ภายใน หลัก - - -

myNamespace - ศาล -
ค. พิมพ์ - - -


ศาล - 'สวัสดีชาวโลก!' - มาตรฐาน - สิ้นสุด -

กลับ 0 -

-

คอมไพลเลอร์ไม่ได้เลือกคำสั่ง cout ที่แสดงข้อมูลบนหน้าจอคอนโซล คอมไพลเลอร์ไม่เข้าใจเนมสเปซที่เป็นของคำสั่ง cout และทำให้เกิดข้อผิดพลาด วิธีแก้ไขข้อผิดพลาดนี้คือการเพิ่มอ็อบเจ็กต์เนมสเปซด้วยคำสั่ง cout เพื่อให้คอมไพเลอร์สามารถอ่านและทำความเข้าใจได้ เพิ่ม “std::” ข้างคำสั่ง cout และรันโค้ด ผลลัพธ์ต่อไปนี้จะแสดงบนหน้าจอคอนโซล:

บทสรุป

ที่นี่ เราสามารถพูดได้ว่าการแสดงเอาต์พุตบนหน้าจอคอนโซลยังสร้างข้อผิดพลาดที่ไม่ใช่ข้อผิดพลาดทางไวยากรณ์หรือข้อผิดพลาดเชิงตรรกะด้วย โดยส่วนใหญ่แล้ว ผู้ใช้เขียนโค้ดได้ดี แต่คอมไพเลอร์ไม่เข้าใจ คอมไพเลอร์มีความคลุมเครือเกี่ยวกับอินพุต ดังนั้น ชี้แจงทุกขั้นตอนของโค้ดด้วยเนมสเปซและไวยากรณ์ที่เหมาะสม เพื่อหลีกเลี่ยงข้อผิดพลาดในภาษาการเขียนโปรแกรม C++ ขั้นตอนที่เกี่ยวข้องในการแก้ไขปัญหานี้คือการใช้ตัวระบุที่ชัดเจน การป้องกันการขัดแย้งของเนมสเปซ และการตรวจสอบให้แน่ใจว่าฟังก์ชันหรือออบเจ็กต์ที่ต้องการระบุขั้นตอนที่เกี่ยวข้องในการแก้ไขปัญหานี้