'错误:无法将'std :: ostream {aka std :: basic_ostream <char>}'左值绑定到'std :: basic_ostream <char>&amp;&amp;'没有模板

时间:2017-11-27 20:34:35

标签: c++

我为这个问题读了类似的问题但是有模板。

我没有模板,但我有同样的错误。这是我第一次重载<<运算符。

我有三个档案。主文件,.h文件和.cpp文件。类Team使用我实现的另一个类,但我不认为该错误是由此类引起的。我认为我错了重载&lt;&lt;操作

这是我的.h文件:

#include "Calciatore.h"
#include <list>

class Team{
    list<Calciatore*> calciatori;
    string nome;
    int punti;


public:
    Team();
    Team(string, int);
    Team(list<Calciatore*>, string, int);

    void set_calciatori(list<Calciatore*>);
    list<Calciatore*> get_calciatori();
    void set_calciatore(Calciatore*, int);
    Calciatore* get_calciatore(int);
    void set_nome(string);
    string get_nome() const;
    void set_punti(int);
    int get_punti() const;
    void add_calciatore(Calciatore*);

    bool operator<(Team const&); //Overload operatore < e passaggio per riferimento(riduco utilizzo memoria)
    bool operator>(Team const&);
    std::ostream& operator<<(std::ostream&);

private:
    void set_calciatori();

};

这是我的.cpp文件:

#include "Team.h"
#include <stdexcept>
#include <iostream>

Team::Team(){
    set_calciatori();
    set_nome("");
    set_punti(0);
}

Team::Team(string nome, int punti){
    set_calciatori();
    set_nome(nome);
    set_punti(punti);
}

Team::Team(list<Calciatore*> calciatori, string nome, int punti){
    set_calciatori(calciatori);
    set_nome(nome);
    set_punti(punti);
}

void Team::set_calciatori(list<Calciatore*> calciatori){
    if(calciatori.size() < 11 || calciatori.size() > 25){
        cout << "\nLa lista deve contenere un numero di calciatori compreso tra 11 e 25";
        return;
    }

    this->calciatori = calciatori;
}

void Team::set_calciatori(){
    for(int i = 0; i < 11; i++){
        this->calciatori.push_back(new Calciatore());
    }
}

list<Calciatore*> Team::get_calciatori(){
    return this->calciatori;
}

void Team::set_calciatore(Calciatore* calciatore, int pos){
    if(pos < 0 || pos > this->calciatori.size()){
        cout << "\nImpossibile inserire l'oggetto nella posizione inserita";
        return;
    }

    list<Calciatore*>::iterator it = calciatori.begin();
    advance(it, pos);   //Avanzo l'iteratore fino alla posizione pos
    this->calciatori.insert(it, calciatore);
}

Calciatore* Team::get_calciatore(int pos){
    if(pos < 0 || pos > this->calciatori.size()){
        cout << "\nImpossibile restituire l'oggetto alla posizione inserita";
        return NULL;
    }

    list<Calciatore*>::iterator it = calciatori.begin();
    advance(it, pos);

    return *it;
}

void Team::set_nome(string nome){
    this->nome = nome;
}

string Team::get_nome() const{
    return this->nome;
}

void Team::set_punti(int punti){
    this->punti = punti;
}

int Team::get_punti() const{
    return this->punti;
}

void Team::add_calciatore(Calciatore* calciatore){
    if(calciatori.size() >= 25){
        cout << "\nLa squadra è già al completo";
        return;
    }
    calciatori.push_back(calciatore);
}

bool Team::operator <(Team const &t){ //Ordino per punti. Se uguali guardo il nome
    if( get_punti() == t.get_punti()){
        return get_nome() < t.get_nome();
    }

    return get_punti() < t.get_punti();
}

bool Team::operator >(Team const &t){
    if( get_punti() == t.get_punti()){
        return get_nome() > t.get_nome();
    }

    return get_punti() > t.get_punti();
}

std::ostream& Team::operator<<(std::ostream& out){
    out << "\nNome : \t" << get_nome() << " \tPunti : \t" << get_punti();
    return out;
}

这是主要的:

void set_Campionato(Team*[]);
void print_Campionato(Team*[]);

int main() {
    Team* serieA[20];
    set_Campionato(serieA);
    sort(serieA, serieA+20);
    print_Campionato(serieA);

    return 0;
}

void set_Campionato(Team* serieA[]){
    ...
}

void print_Campionato(Team* serieA[]){
    for(int i = 0; i < 20; i++){
        cout << *serieA[i] << "\n"; //This is line wher appears errore
    }
}

我使用gcc 6.3.0。 对不起我的英文,谢谢你的回答。

0 个答案:

没有答案