Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > использование шаблонов


Автор: centab 3.5.2006, 13:06
При компиляции возникает ошибка в строке описания заголовка перегрузки функции operator<<
Из-за чего это происходит? что здесь не так.

#include <iostream>
using namespace std;

template <class type1, class type2>

class telo{
    type1 a,b,c; // ??????, ????? ? ?????? ????
    type2 dens;  //    ????????? ????
public:
    telo(type1 aa=1, type1 bb=1, type1 cc=1, type2 d=1):a(aa),b(bb),c(cc),dens(d){}
    double volume(void){return a*b*c*dens;}
    bool operator< (telo& q){ 
        if(this->volume()>q.volume()) return false;
        return true;
    }    
    friend ostream& operator<< (ostream& out, telo& t);
};



ostream& std::operator<< (ostream& out, telo& t){
    out<<"parametres of objects:"<<endl;
    out<<"width="<<t.a<<endl;
    out<<"length="<<t.b<<endl;
    out<<"height="<<t.c<<endl;
    out<<"density="<<t.dens<<endl<<endl;
    return out;
}

int main (){
    telo <int,double> a(1,2,3,4.5);
    return 0;
}


 

Автор: Любитель 3.5.2006, 13:33
Цитата(centab @  3.5.2006,  13:06 Найти цитируемый пост)

[code=cpp]
bool operator< (telo& q) // ...
friend ostream& operator<< (ostream& out, telo& t);

По идее должно быть:
Код

bool operator< (telo<type1,type2> &q) // ...
friend ostream& operator<< (ostream& out, telo<type1,type2> &t);

 

Автор: Romikgy 3.5.2006, 13:41
Код

template <class type1, class type2>

class telo{
    type1 a,b,c; // ??????, ????? ? ?????? ????
    type2 dens;  //    ????????? ????
public:
    telo(type1 aa=1, type1 bb=1, type1 cc=1, type2 d=1):a(aa),b(bb),c(cc),dens(d){}
    double volume(void){return a*b*c*dens;}
    bool operator< (telo& q){ 
        if(this->volume()>q.volume()) return false;
        return true;
    }    
    friend ostream& operator<< (ostream& out, telo& t){
    out<<"parametres of objects:"<<endl;
    out<<"width="<<t.a<<endl;
    out<<"length="<<t.b<<endl;
    out<<"height="<<t.c<<endl;
    out<<"density="<<t.dens<<endl<<endl;
    return out;
};
};


int main(int argc, char *argv[])
{
     telo <int,double> a(1,2,3,4.5);
     cout<<a;
    system("PAUSE");
    return EXIT_SUCCESS;
}

А так? 
У меня работает smile 

Автор: centab 3.5.2006, 14:27
Так работает, спасибо. 
Но есть вопрос: дружественная функция описана в классе? и в конце стоит ";"? 

Автор: Daevaorn 3.5.2006, 17:25
Цитата(centab @  3.5.2006,  14:06 Найти цитируемый пост)
ostream& std::operator<< (ostream& out, telo& t){

Ты не можешь сам объявлять что-то в пространстве имен std.
Цитата(centab @  3.5.2006,  15:27 Найти цитируемый пост)
дружественная функция описана в классе? 

Можно и вне.
Цитата(centab @  3.5.2006,  15:27 Найти цитируемый пост)
и в конце стоит ";"?  

Дело вкуса. В принципе не нужно. Наверно могут возникнуть проблемы с переносимостью. 

Автор: MAKCim 3.5.2006, 19:51
хочешь определить вне надо предварительно объявить шаблон функции-друга
Код

template<class type1, class type2> ostream& operator<<(ostream&, telo<type1,type2>&);

template <class type1, class type2>
class telo{
    type1 a,b,c; // ??????, ????? ? ?????? ????
    type2 dens;  //    ????????? ????
public:
    telo(type1 aa=1, type1 bb=1, type1 cc=1, type2 d=1):a(aa),b(bb),c(cc),dens(d){}
    double volume(void){return a*b*c*dens;}
    bool operator< (telo& q){ 
        if(this->volume()>q.volume()) return false;
        return true;
    }    
    friend ostream& operator<< <> (ostream&, telo<type1,type2>&);
};

template<class type1, class type2> ostream& operator<<(ostream& o1, telo<type1,type2>& o2) {/*код*/}

int main(int argc, char *argv[])
{
     telo <int,double> a(1,2,3,4.5);
     cout<<a;
    system("PAUSE");
    return EXIT_SUCCESS;
}
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)