Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2011, 11:31   #1
monolit111
Пользователь
 
Регистрация: 14.09.2011
Сообщений: 95
Смех проблемы с классом

выпадает непонятная мне ошибка..точнее. непонятна ее причина:

хедер:
Код:
class MyException {};

struct kpair {
    public:
        int first, second;
};

template <typename T>
class vect {
private:
    int m;
public:
    T* a;
    void add(int nn, T aa);
    void add(int nn);
    T& operator[](int k) throw (MyException);
    ~ vect();
};

template <typename T>
class matrix {
private:
    int n, m;
    vect<T>* matr;
public:
    matrix();
    matrix(int nn, int mm, T val);
    matrix(int nn, int mm);
    matrix(const matrix& mt);
    //доступ по индексу
    vect<T>& operator[](int i) throw (MyException);

    int size_n() { return n; }

    int size_m() { return m; }

стр.76>>)    bool compare(matrix<T> b, bool(*Pred)(T , T , bool), bool fl=0) throw (MyException);
    //перегруженая ф-я , в кот-й отсутствует логический параметр
    bool compare(matrix<T> b, bool(*Pred)(T , T)) throw (MyException);
};
реализация:
Код:
#include "matrix.h"

template <typename T>
void vect<T>::add(int nn, T aa) {
    m=nn;
    a=new int[m];
    for(int i=0; i<m; i++) a[i]=aa;
}
template <typename T>
void vect<T>::add(int nn) {
    m=nn;
    a=new int[m];
}
template <typename T>
T& vect<T>::operator[](int k) throw (MyException) {
    if (k>=m) throw MyException(1);
    return a[k];
}
template <typename T>
vect<T>::~vect() {
    delete[] a;
}

template <typename T>
matrix<T>::matrix():n(1), m(1) {
    matr=new vect<T>[n];
    for(int i=0; i<n; i++) matr[i].add(m);
}
template <typename T>
matrix<T>::matrix(int nn, int mm, T val):n(nn), m(mm) {
    matr=new vect<T>[n];
    for(int i=0; i<n; i++) matr[i].add(m, val);
}
template <typename T>
matrix<T>::matrix(int nn, int mm):n(nn), m(mm) {
    matr=new vect<T>[n];
    for(int i=0; i<n; i++) matr[i].add(m);
}
template <typename T>
matrix<T>::matrix(const matrix& mt):n(mt.n), m(mt.m) {
    matr=new vect<T>[n];
    for(int i=0; i<n; i++) {
        matr[i].add(m);
        for(int j=0; j<m; j++) matr[i][j]=mt.matr[i][j];
    }
}
template <typename T>
vect<T>& matrix<T>::operator[](int i) throw (MyException) {
    if (i>=n) throw MyException(1);
    return matr[i];
}
template <typename T>
стр.116>>)  bool matrix<T>::compare(matrix<T> b, bool(*Pred)(T , T , bool), bool fl=0) throw (MyException) {
    if (n!=b.n || m!=b.m) throw MyException(3);
    for(int i=0; i<n; i++)
        for(int j=0; j<m; j++)
            if (!Pred(matr[i][j],b.matr[i][j], fl)) return false;
    return true;
}
//перегруженая ф-я , в кот-й отсутствует логический параметр
template <typename T>
bool matrix<T>::compare(matrix<T> b, bool(*Pred)(T , T)) throw (MyException) {
    if (n!=b.n || m!=b.m) throw MyException(3);
    for(int i=0; i<n; i++)
        for(int j=0; j<m; j++)
            if (!Pred(matr[i][j],b.matr[i][j])) return false;
    return true;
}
Ощибка:


\matrix.cpp|116|error: default argument given for parameter 3 of 'bool matrix<T>::compare(matrix<T>, bool (*)(T, T, bool), bool)'|
\matrix.h|76|error: after previous specification in 'bool matrix<T>::compare(matrix<T>, bool (*)(T, T, bool), bool)'|
||=== Build finished: 2 errors, 0 warnings ===|
monolit111 вне форума Ответить с цитированием
Старый 15.12.2011, 12:27   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

1. реализация шаблонов должна быть в хидерах
2. при описании реализации функций значения по умолчанию не указываются (их обычно берут в каменты, чтоб не забыть)

Код:
template <typename T>
bool matrix<T>::compare(matrix<T> b, bool(*Pred)(T , T , bool), bool fl /* = 0 */) throw (MyException) {
    if (n!=b.n || m!=b.m) throw MyException(3);
    for(int i=0; i<n; i++)
        for(int j=0; j<m; j++)
            if (!Pred(matr[i][j],b.matr[i][j], fl)) return false;
    return true;
}
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 15.12.2011, 12:36   #3
monolit111
Пользователь
 
Регистрация: 14.09.2011
Сообщений: 95
По умолчанию

спасибо))))
monolit111 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с классом cyber_NINJA Общие вопросы Delphi 4 27.12.2010 20:41
Проблема с классом Celestia Общие вопросы Delphi 3 03.12.2010 15:40
Проблема с классом _-Re@l-_ Общие вопросы C/C++ 3 23.09.2010 19:15
Работа с классом UnChanter Помощь студентам 2 14.03.2010 20:23
Работа с классом| C++ Konicy Общие вопросы C/C++ 15 21.12.2009 19:08