سؤال

مرحبًا ، كل ما لدي ما يلي في وظيفة العضو

int tt = 6; 
vector<set<int>>& temp = m_egressCandidatesByDestAndOtMode[tt]; 
set<int>& egressCandidateStops = temp.at(dest);

والإعلان التالي لمتغير عضو

map<int, vector<set<int>>> m_egressCandidatesByDestAndOtMode;

ومع ذلك ، أحصل على خطأ عند التجميع (برنامج التحويل البرمجي Intel 11.0)

1>C:\projects\svn\bdk\Source\ZenithAssignment\src\Iteration\PtBranchAndBoundIterationOriginRunner.cpp(85): error: no operator "[]" matches these operands
1>            operand types are: const std::map<int, std::vector<std::set<int, std::less<int>, std::allocator<int>>, std::allocator<std::set<int, std::less<int>, std::allocator<int>>>>, std::less<int>, std::allocator<std::pair<const int, std::vector<std::set<int, std::less<int>, std::allocator<int>>, std::allocator<std::set<int, std::less<int>, std::allocator<int>>>>>>> [ const int ]
1>          vector<set<int>>& temp = m_egressCandidatesByDestAndOtMode[tt]; 
1>                                                                    ^

أعلم أنه يجب أن يكون شيئًا سخيفًا ولكن لا يمكنني رؤية ما ارتكبته خطأ.

تحديث أنا أدعو هذا من وظيفة عضو const وهذا هو السبب في أن نوع متغير العضو هو const لذلك اعتقدت أن شيء مثل ما يلي يجب إصلاحه:

int dest = 0, tt = 6; 
const set<int>& egressCandidateStops = m_egressCandidatesByDestAndOtMode[tt].at(dest); 

ولكن لا النرد ... لا يزال نفس الخطأ.

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

المحلول

أنواع المعاملات هي: const std :: الخريطة<int ...

map::operator[] لا يعمل مع أ const map.

أنا أجاب هذا قبل بضعة أيام.

الخريطة :: المشغل [] غريب بعض الشيء. يفعل هذا:

  1. ابحث عن المفتاح.
  2. إذا وجدت ، أعدها.
  3. إذا لم يكن الأمر كذلك ، أدخله وبناء القيمة المرتبطة به.
  4. ثم إرجاع إشارة إلى القيمة الجديدة.

الخطوة 3 غير متوافقة مع القدة. بدلاً من وجود اثنين من المشغلات التي تعمل بشكل مختلف [] التحميل الزائد ، تجبرك اللغة على استخدام الخريطة :: البحث عن كائنات const.

نصائح أخرى

النموذج الأولي ل [] هو

 data_type& operator[](const key_type& k)

أي عملية غير const ، لذلك لا يمكنك الاتصال بها على عضو من وظيفة عضو Const.

يمكنك تغيير الرمز إلى:

std::map<...>::const_iterator where = m_egressCandidatesByDestAndOtMode.find(tt);
if (egressCandidatesByDestAndOtMode.end() != where) {
    const vector<set<int>>& temp = where->second;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top