سؤال

والنظر في البرنامج التالي:

    namespace NS2 {
      class base { };

      template<typename T>
      int size(T& t) {
        std::cout << "size NS2 called!" << std::endl;
        return sizeof(t);
      } 
    };

    namespace NS1 {
      class X : NS2::base { };
    }

    namespace NS3 {
      template<typename T>
      int size(T& t) {
        std::cout << "size NS3 called!" << std::endl;
        return sizeof(t) + 1;
      }

      template<typename T>
      class tmpl 
      {
      public:
        void operator()() { size(*this); }
      };
    };

int main() +{
  NS3::tmpl<NS1::X> t;
  t();
  return 0;
}

وبلدي مترجم (دول مجلس التعاون الخليجي 4.3.3) لا ترجمة البرنامج لأن الدعوة إلى حجم هي ambigous. يبدو أن مساحة NS2 لتضاف إلى مجموعة من النطاقات المنتسبين للدعوة الحجم في tmpl الصف. حتى بعد قراءة المقطع حول كونيغ بحث في المعيار ISI ولست متأكدا إذا كان هذا السلوك القياسية تتوافق. فعلا؟ أي لا أحد يعرف وسيلة للتغلب على هذه المشكلة دون تأهيل الدعوة الحجم مع البادئة NS3؟

ويرجع الفضل في ذلك مسبقا!

هل كانت مفيدة؟

المحلول

والحجج قالب والفئات الأساسية على حد سواء تؤثر ADL، لذلك أعتقد أن دول مجلس التعاون الخليجي هو الصحيح، وهنا: NS3 يأتي من النطاق الحالي، NS1 من حجة قالب X، وNS2 من الفئة الأساسية من ذي الحجة قالب

لديك لإزالة الغموض بطريقة أو بأخرى. أنا أقترح إعادة تسمية واحدة أو أكثر من الوظائف، إذا كان ذلك ممكنا، أو ربما استخدام SFINAE لإزالة الغموض وظائف.

و(وضع مماثل: لاحظ أن دفعة :: noncopyable هو في الواقع "typedef وnoncopyable _ :: noncopyable noncopyable"؛ بحيث لا الحصول على إضافة دفعة مساحة الاسم إلى مجموعة العدل من الأنواع التي تجنيها من ذلك.)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top