Гуру,Невозможно привязать оператора << в CPP
Учитывая два класса, определенные следующим образом (атрибуты, методы и реализация опущена):
struct A { friend std::ostream& operator << (std::ostream& o, const A& c); };
struct B { friend std::ostream& operator << (std::ostream& o, const B& c); };
Я использовал классы следующим образом:
ln 1: A *arrayA = new A[10];
ln 2: B *arrayB = new B[10];
ln 3: /* some codes to initialize arrayA and arrayB */
ln 4: for (int i = 0; i < 10; i++) { std::cout << arrayA[i]; } // this work
ln 5: for (int j = 0; j < 10; j++) { std::cout << arrayB[j]; } // this complain
Мой компилятор жалуется для класса B, как
error: cannot bind 'std::ostream {aka std::basic_ostream<char>}' lvalue
to 'std::basic_ostream<char>&&'
../lib/gcc/mingw32/4.6.1/include/c++/ostream:581:5 error initializing argument 1
of 'std::basic_ostream<_CharT, _Traits>&
std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&)
[with _CharT = char, _Traits = std::char_traits<char>, _Tp = ClsB]
Я не знаю, что не так в строке 5. Комментируя строку 5 основной программы, дайте мою хорошую компиляцию, то есть мое определение оператора < < для класса B синтаксически корректно. Пожалуйста, дайте любые указания и спасибо.
Yam Hon
- Платформа: Win 7
- Mingw32: версия 2011-11-08
- GNU Make 3.82
- G ++ версии 4.6.1
[Редактировать 1 ] У моей программы фактически есть более двух классов, и у всех моих классов есть оператор < < перегружен для отладки. Я использовал одну и ту же подпись (с соответствующим 2-м аргументом) для всех классов. Эта ошибка вызывает только класс B.
[Edit 2] полную версию моих классов:
struct CPeople { // this is class B
int age;
int ageGroup;
int zipcode;
int communityID;
int areaID;
int familyID;
int contactID;
int contactType; /* P, D, E, M, H, W */
int state;
int vaccinated; /* 0 = unvac, 1 = vaccinated */
friend std::ostream& operator<< (std::ostream& o, const CPeople& c)
{
o << "CPeople (" << static_cast<void const *>(&c) << "): "
<< "\tAge Group: " << c.ageGroup
<< "\tZip Code: " << c.zipcode
<< "\tCommunityID: " << c.communityID
<< "\tArea ID: " << c.areaID
<< "\tFamily ID: " << c.familyID
<< "\tSchool Type: " << c.contactType
<< "\tContact ID: " << c.contactID
<< "\tState: " << c.state
<< "\tVaccination: " << c.vaccinated;
return (o << std::endl);
}
};
struct CWorkGroup : public CContact { // this is class A
/* to which community this member belongs */
std::vector<long> member_com;
CStatistics statistics;
friend std::ostream& operator<< (std::ostream& o, const CWorkGroup& c)
{
o << "CWorkGroup (" << static_cast<void const *>(&c) << "): ";
o << "avflag = " << c.avflag << "; member: " << c.size();
for (int i = 0; i < c.size(); i++)
{
o << "; (" << i << " = " << c.member[i] << ")";
}
o << std::endl;
return (o << c.statistics);
}
};
Использование A:
for (int i = 0; i < cntWG; i++) { std::clog << WG[i]; } std::clog << std::endl;
Использование B (это ошибка):
CPeople *people_total = new CPeople[cntTotalPop];
for (pIdx = 0; pIdx < cntTotalPop; pIdx++)
{
std::cout << people_total[pIdx];
}
Как выглядит ваш заголовок функции для реализации 'operator <<' (для B)? – chris
Вы пропустили ';' в конце классов? Также вы можете опубликовать некоторый код, отображаемый в строке 3. – iammilind
Фактически весь оператор << определяется как друг, и они реализованы внутри определений классов. –