2012-05-02 2 views
0

Гуру,Невозможно привязать оператора << в 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]; 
} 
+0

Как выглядит ваш заголовок функции для реализации 'operator <<' (для B)? – chris

+0

Вы пропустили ';' в конце классов? Также вы можете опубликовать некоторый код, отображаемый в строке 3. – iammilind

+0

Фактически весь оператор << определяется как друг, и они реализованы внутри определений классов. –

ответ

1

Классы и структуры нужно положить точку с запятой, поэтому добавьте точку с запятой в конце обеих строк:

struct A { friend std::ostream& operator << (std::ostream& o, const A& c); }; 
struct B { friend std::ostream& operator << (std::ostream& o, const B& c); }; 
+0

благодарит за комментарий –

+0

@ YamHon.CHAN, это решило вашу проблему? Если нет, вы получаете ту же ошибку? – chris

+0

недостающая запятая - это только опечатка. спасибо за это.Та же ошибка все еще встречается –

Смежные вопросы