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


Автор: DragonFire 8.4.2009, 21:53
Создаю шаблон класса:
Код

template <typename tname,typename tvalue,typename tsize> 
class object
{
private:
    tname name;        //Имя объекта
    tvalue value;    //Велечина
    tsize size;        //Размерность велечины
public:
    object(tname name,tvalue value,tsize size)
    {
        set(name,value,size);    
    }
    object()
    {
    }
    void set(tname name,tvalue value,tsize size)
    {
        this->name=name;
        this->value=value;
        this->size=size;
    }
    friend ostream & operator<<(ostream & out, object<tname,tvalue,tsize> & obj);
    bool operator<(object<tname,tvalue,tsize> & obj)
    { 
        if (size!=obj.size)
            return (size<obj.size); 
        else
            return (value<obj.value); 
    }
};

Пишу функцию: 
Код

template <typename tname,typename tvalue,typename tsize>
ostream & operator<<(ostream & out, object<tname,tvalue,tsize> & obj)
{ 
    if (obj.size>0)
        out<<"Name="<<obj.name<<"; Value="<<obj.value<<"e+"<<obj.size<<"\t\t";
    else
        out<<"Name="<<obj.name<<"; Value="<<obj.value<<"e"<<obj.size<<"\t\t";
    return out;
}

Инициализирую массивы классов и пытаюсь их напечатать:
Код

int main()
{
    //Инициализация    
        //Статически
    object<string,double,int> Physics[] = 
    {
        object<string,double,int> ("P",10.1,5),
        object<string,double,int> ("T",300,1),
        object<string,double,int> ("V",6.51,3),
        object<string,double,int> ("M",6.2,-2),
    };
        //Динамически
    object<int,int,double> *Math;
    Math = new object<int,int,double>[n];
    Math[0].set(1,10,1.5);
    Math[1].set(2,12,1.7);
    Math[2].set(3,14,2.3);
    Math[3].set(4,16,1.2);

        print< object<string,double,int>,object<int,int,double> >(Physics,Math,"Input");
    return 0;
}

Получаю 2 ошибки линка (привожу одну из них, вторая аналогичная, видимо для второго параметра):
Код

1>main.obj : error LNK2019: unresolved external symbol "class std::basic_ostream<char,struct std::char_traits<char> > 
& __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class object<int,int,double> &)" 
(??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@AAV?$object@HHN@@@Z) 
referenced in function "void __cdecl print<class object<class std::basic_string<char,struct std::char_traits<char>,
class std::allocator<char> >,double,int>,class object<int,int,double> >(class object
<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,
double,int> * const,class object<int,int,double> * const,class std::basic_string<char,
struct std::char_traits<char>,class std::allocator<char> >)" (??$print@V?$object@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D
@2@@std@@NH@@V?$object@HHN@@@@YAXQAV?$object@V?$basic_string@DU?$
char_traits@D@std@@V?$allocator@D@2@@std@@NH@@QAV?$object@HHN@@V?$basic_string@DU?$
char_traits@D@std@@V?$allocator@D@2@@std@@@Z)


З.Ы. VS2008

Автор: Lazin 8.4.2009, 22:08
Цитата

 friend ostream & operator<<(ostream & out, object<tname,tvalue,tsize> & obj);

замени на 
Код

template<class tn, class tv, class ts>
friend ostream& operator << ( ostream& out, const object<tn, tv, ts>& obj);

либо просто реализуй функцию внутри класса
Код

template<class tname, class tvalue, class tsize>
class object
{
....
friend ostream& operator << (ostream& out, const object& obj)
{
   реализация
}
};

Автор: DragonFire 8.4.2009, 22:32
Lazin, Спасибо smile

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