سؤال

هل يمكن أن تخبرني لماذا يعطيني الكود التالي الخطأ التالي - استدعاء "C(int)" المحمل بشكل زائد غامض

أعتقد أنه نظرًا لأن C(char x) خاص، فإن C(float) ctor فقط هو الذي يكون مرئيًا من الخارج ويجب استدعاؤه عن طريق تحويل int إلى float.

لكن ليست هذه هي المسألة.

class C
{
    C(char  x)
    {
    }
public:
    C(float t)
    {
    }
};

int main()
{
    C p(0);
}
هل كانت مفيدة؟

المحلول

ووبيان ذلك في "اعتبارا من C ++" سكوت ماير. والسبب في هذا هو غامض هو أنهم يريدون التأكد من أن مجرد تغيير الرؤية لأحد أعضاء لن يغير المعنى من التعليمات البرمجية الموجودة بالفعل في أماكن أخرى.

وعلى خلاف ذلك، لنفترض كانت الطبقة C الخاص في رأس في مكان ما. إذا كان لديك عضو خاص C (الباحث)، والرمز الذي الحاضر سيدعو C (تعويم). إذا، لسبب ما، قدم (الباحث) عضوا C العام، فإن القانون القديم دعوة فجأة أن الأعضاء، على الرغم من أن أيا من القانون القديم، ولا وظيفة دعت قد تغيرت .

وتحرير: عن أسباب:

وأسوأ من ذلك، لنفترض كان لديك وظائف 2 التالية:

C A::foo() 
{
    return C(1.0);
}

C B::bar() 
{
    return C(1.0);
}

وهذه الوظيفتين يمكن استدعاء وظائف مختلفة اعتمادا على ما إذا تم الإعلان إما فو أو شريط كصديق لC، أو ما إذا كان A أو B يرث منه. وجود <م> متطابقة دعوة رمز وظائف مختلفة أمر مخيف.

(وهذا ربما ليس كما وضعت كذلك مناقشة سكوت ماير، ولكن هذه هي الفكرة).

نصائح أخرى

0 هو int يكتب.نظرًا لأنه يمكن تحويله ضمنيًا إلى تعويم أو حرف متساوٍ، فإن الاستدعاء غامض. الرؤية ليست ذات صلة لهذه الأغراض.

إما أن تضع 0.0, 0., ، أو 0.0f, ، أو تخلص من C(char) منشئ تماما.

يحرر:الجزء ذو الصلة من المعيار، القسم 13.3:

3) [...] ولكن بمجرد تحديد الوظائف المرشحة وقوائم الوسائط، يكون اختيار الوظيفة الأفضل هو نفسه في جميع الحالات:

  • أولاً، يتم اختيار مجموعة فرعية من الوظائف المرشحة - تلك التي تحتوي على العدد المناسب من الوسائط وتلبي شروطًا معينة أخرى - لتشكيل مجموعة من الوظائف القابلة للحياة (13.3.2).
  • ثم يتم تحديد أفضل وظيفة قابلة للحياة بناءً على تسلسلات التحويل الضمنية (13.3.3.1) اللازمة لمطابقة كل وسيطة مع المعلمة المقابلة لكل وظيفة قابلة للحياة.

4) إذا كانت أفضل وظيفة قابلة للتطبيق موجودة وفريدة من نوعها، فإن حل التحميل الزائد ينجح وينتجها كنتيجة.وإلا فسيفشل تحليل التحميل الزائد ويكون الاستدعاء غير صحيح.عندما ينجح حل التحميل الزائد، ولا يمكن الوصول إلى أفضل وظيفة قابلة للتطبيق (البند 11) في السياق الذي يتم استخدامه فيه، يكون البرنامج غير صحيح.

لاحظ أن الرؤية ليست جزءًا من عملية الاختيار.

وأنا لا أعتقد أن:

C p(0);

ويتم تحويلها إلى:

C(float t)

وربما عليك القيام به:

C p(0.0f);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top