SORU
12 Mayıs 2011, PERŞEMBE


hata: '' xxx atar elemeleri argüman olarak geçen xxx

#include <iostream>
#include <set>

using namespace std;

class StudentT {

public:
    int id;
    string name;
public:
    StudentT(int _id, string _name) : id(_id), name(_name) {
    }
    int getId() {
        return id;
    }
    string getName() {
        return name;
    }
};

inline bool operator< (StudentT s1, StudentT s2) {
    return  s1.getId() < s2.getId();
}

int main() {

    set<StudentT> st;
    StudentT s1(0, "Tom");
    StudentT s2(1, "Tim");
    st.insert(s1);
    st.insert(s2);
    set<StudentT> :: iterator itr;
    for (itr = st.begin(); itr != st.end(); itr  ) {
        cout << itr->getId() << " " << itr->getName() << endl;
    }
    return 0;
}

Satır:

cout << itr->getId() << " " << itr->getName() << endl;

Bir hata ver:

../main.:35 cpp: hata: 'sabit StudentT' 'bu' argüman 'int StudentT::getİd()' atar elemeleri . olarak geçiyor

../main.:35 cpp: hata: 'sabit StudentT' 'bu' argüman ':: std dize StudentT::getName()' atar elemeleri . olarak geçiyor

Bu kod ile yanlış ne? Teşekkür ederim!

CEVAP
12 Mayıs 2011, PERŞEMBE


std::set nesneleri const StudentT olarak saklanır. Çok çalıştığınızda çağrı getId() const nesne derleyici algılar bir sorun, yani sen diyorsun olmayan sabit üye işlev hangi nesne üzerinde sabit değil izin çünkü olmayan sabit üye işlev SÖZÜ ver değil değiştirmek için nesne; yani derleyici olduğunu yapacakgüvenligetId() nesneyi değiştirmek için bir girişim olabilir varsayım ama aynı zamanda, aynı zamanda nesnenin sabit olmadığını fark; sabit nesneyi değiştirmek için herhangi bir girişim bir hata olmalı. Dolayısıyla derleyici hata mesajı verir.

Çözüm basit: işlevleri sabit olarak: olun

int getId() const {
    return id;
}
string getName() const {
    return name;
}

Bu şimdi getId() ve sabit nesneler üzerinde getName() gibi diyebilirsiniz, çünkü bu gereklidir

void f(const StudentT & s)
{
     cout << s.getId();   //now okay, but error with your versions
     cout << s.getName(); //now okay, but error with your versions
}

Bir not olarak, operator< olarak uygulamak :

inline bool operator< (const StudentT & s1, const StudentT & s2)
{
    return  s1.getId() < s2.getId();
}

Not parametreleri şimdi const başvuru.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:
C++

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bobinire

    bobinire

    24 EYLÜL 2006
  • Google Developers

    Google Devel

    23 AĞUSTOS 2007
  • theatre2film

    theatre2film

    12 NİSAN 2006