Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ПЕРЕГРУЗКА << и >> в шаблоне, НЕ работает 
:(
    Опции темы
niknor
Дата 20.11.2006, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 21.4.2006
Где: РОССИЯ, Набережны е челны

Репутация: нет
Всего: нет



помогите пожалуйста разобратьсяв шаблоне в перегрузке << и >> 
после линковки выходи:
MatrSh 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 Matr<double> &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@AAV?$Matr@N@@@Z) referenced in function _main
MatrSh fatal error LNK1120: 1 unresolved externals

Код

#include <iostream>
#include <iomanip>
#include <conio.h>
#include <windows.h>
#include <cmath>

using namespace std;


void rus(char*a)
{
    char*b=new char[strlen(a)+1];
    CharToOem(a,b);
    cout<<b;
    delete[] b;
}

template <class E> class Matr
{
private:
    int stl, str;
    E *tab;
    E  DetVn(E* a,int n);
public:
    Matr();
    Matr( const int a, const int b, const E *VhMt);
    Matr(const int a, const int b);
    Matr(const int a);
    Matr(const Matr<E>&);    //copy constructor
    ~Matr();
//......
    friend istream &operator>>(istream&, Matr<E>&);
    friend ostream &operator<<(ostream&, Matr<E>&);//...
};
template <class E> Matr <E>::Matr()
{
    stl=1;
    str=1;
    tab=new E[1];
    tab[0]=0;
}
template <class E> Matr <E>::Matr(const Matr<E> &fs)
{
    str=fs.str;
    stl=fs.stl;
    tab=new E[stl*str];
    for (int i(0); i<str; i++)
        for (int j(0); j<stl ; j++)
            tab[i*stl+j]=fs.tab[i*stl+j];
}

template <class E> Matr<E>::Matr(const int a,const int b,const E*  VhMt)
{
    str=a;
    stl=b;
    if ((str==0) || (stl==0))
    {
        rus("Количество столбцов или строк задано неверно");
        exit(-88);
    }
    if (!(tab=new E[str*stl]))
    {
        rus("Памяти Маловато");
        cout<<endl;
        exit(-99);
    }
    else    
    {
        for (int i(0); i<str; i++)
        {
            for (int j(0); j<stl ; j++)
                tab[i*stl+j]=VhMt[i*stl+j];
        }
    }
}

template <class E> void Matr<E>::Ekr()const
{
    rus("Матрица: \n");
    for(int i(0); i<str; i++)
    {
        for(int j(0); j<stl; j++)
            cout<<tab[i*stl+j]<<" "; 
        cout<<endl;
    }
}

template <class E> Matr<E>::~Matr()
{
    delete[] tab;
}



template <class E> istream &operator>>(istream &chis, Matr<E> & mat)
{
    for (int k=0; k<mat.str*mat.stl; ++k )
        cin >> mat.tab[k];
    return chis;
}

template <class E> ostream &operator<<(ostream &chos, Matr<E> & mat)
{
     for (int i=0; i<mat.str; ++i)
    {
        for (int j=0; j<mat.stl; ++j)
            cout << setw(10) << setprecision(3) << mat.tab[i*mat.stl+j];
        cout << endl;
    }
    return chos;
}

void main()
{    
    
     double b[]={1.2, 4.5, 2.0, 5.6};;
    Matr <double> DoubM(2,2,b);
    cout<<DoubM; // вот это не работает
    DoubM.Ekr();// Это работает
    getch();
}

PM MAIL   Вверх
Daevaorn
Дата 21.11.2006, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Измени
Цитата(niknor @  21.11.2006,  00:49 Найти цитируемый пост)
template <class E> class Matr
{
private:
    int stl, str;
    E *tab;
    E  DetVn(E* a,int n);
public:
    Matr();
    Matr( const int a, const int b, const E *VhMt);
    Matr(const int a, const int b);
    Matr(const int a);
    Matr(const Matr<E>&);    //copy constructor
    ~Matr();
//......
    friend istream &operator>>(istream&, Matr<E>&);
    template< class T > //!!!
    friend ostream &operator<<(ostream&, Matr<T>&);//!!
};


PM MAIL WWW   Вверх
Xenon
Дата 21.11.2006, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Daevaorn, поясни что ты сделал .... А то не понял почему так smile


--------------------
user posted image  
PM MAIL   Вверх
Daevaorn
Дата 21.11.2006, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Xenon, это называет "темный закуток языка программирования" smile
Поясняющий пример:
Код

template <typename T> 
class Foo
{
public:
    friend void bar( Foo<T>& );
    template< typename U >
    void barbar( Foo<U>& );
};

void bar( Foo<int>& )
{

}

template< typename U >
void barbar( Foo<U>& )
{

}

int main()
{    
    Foo< int > foo;
    bar( foo ); //ok
    barbar( foo ); //ok

    Foo< float > foofoo;
    bar( foofoo );//error
    barbar( foofoo );//ok

    return 0;
}

PM MAIL WWW   Вверх
niknor
Дата 21.11.2006, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 21.4.2006
Где: РОССИЯ, Набережны е челны

Репутация: нет
Всего: нет



спасибо
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0859 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.