คำถามติดแท็ก overload-resolution

11
เหตุใดจึงไม่เรียกเมธอด public const เมื่อ non-const เป็นแบบส่วนตัว
พิจารณารหัสนี้: struct A { void foo() const { std::cout << "const" << std::endl; } private: void foo() { std::cout << "non - const" << std::endl; } }; int main() { A a; a.foo(); } ข้อผิดพลาดของคอมไพเลอร์คือ: ข้อผิดพลาด: 'void A :: foo ()' is private` แต่เมื่อฉันลบไพรเวตมันก็ใช้ได้ เหตุใดจึงไม่เรียกเมธอด public const เมื่อ non-const เป็นแบบส่วนตัว …

5
เหตุใดการเพิ่มเมธอดจึงเพิ่มการเรียกที่ไม่ชัดเจนหากไม่เกี่ยวข้องกับความคลุมเครือ
ฉันมีคลาสนี้ public class Overloaded { public void ComplexOverloadResolution(params string[] something) { Console.WriteLine("Normal Winner"); } public void ComplexOverloadResolution<M>(M something) { Console.WriteLine("Confused"); } } ถ้าฉันเรียกแบบนี้: var blah = new Overloaded(); blah.ComplexOverloadResolution("Which wins?"); มันเขียนNormal Winnerไปที่คอนโซล แต่ถ้าฉันเพิ่มวิธีอื่น: public void ComplexOverloadResolution(string something, object somethingElse = null) { Console.WriteLine("Added Later"); } ฉันได้รับข้อผิดพลาดต่อไปนี้: การเรียกไม่ชัดเจนระหว่างวิธีการหรือคุณสมบัติต่อไปนี้:> ' Overloaded.ComplexOverloadResolution(params string[])' …

3
เหตุใดจึงเลือกตัวดำเนินการแปลงเกินพิกัดนี้
พิจารณารหัสต่อไปนี้ struct any { template <typename T> operator T &&() const; template <typename T> operator T &() const; }; int main() { int a = any{}; } ที่นี่ผู้ประกอบการแปลงที่สองถูกเลือกโดยความละเอียดเกินพิกัด ทำไม? เท่าที่ฉันเข้าใจผู้ประกอบการทั้งสองจะอนุมานoperator int &&() constและoperator int &() constตามลำดับ ทั้งสองอยู่ในชุดของฟังก์ชันที่ทำงานได้ การอ่านผ่าน [over.match.best] ไม่ได้ช่วยฉันหาสาเหตุว่าทำไมสิ่งหลังถึงดีกว่า เหตุใดฟังก์ชันหลังจึงดีกว่ารุ่นก่อน

3
ฉันจะป้องกันไม่ให้ C ++ คาดเดาอาร์กิวเมนต์เท็มเพลตที่สองได้อย่างไร
ฉันใช้ไลบรารี่ C ++ ( strf ) ซึ่งบางที่อยู่ภายในนั้นมีรหัสต่อไปนี้: namespace strf { template <typename ForwardIt> inline auto range(ForwardIt begin, ForwardIt end) { /* ... */ } template <typename Range, typename CharT> inline auto range(const Range& range, const CharT* sep) { /* ... */ } } ตอนนี้ฉันต้องการใช้strf::range<const char*>(some_char_ptr, some_char_ptr + some_length)ในรหัสของฉัน แต่ถ้าฉันทำฉันได้รับข้อผิดพลาดต่อไปนี้ (ด้วย …

1
ทำไม {} เนื่องจากอาร์กิวเมนต์ของฟังก์ชันไม่นำไปสู่ความกำกวม?
พิจารณารหัสนี้: #include <vector> #include <iostream> enum class A { X, Y }; struct Test { Test(const std::vector<double>&, const std::vector<int>& = {}, A = A::X) { std::cout << "vector overload" << std::endl; } Test(const std::vector<double>&, int, A = A::X) { std::cout << "int overload" << std::endl; } }; int main() { …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.