![]() |
|
Модераторы: bsa |
![]()
|
|
| Dimetra |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 19.3.2009 Репутация: нет Всего: нет |
Подскажите, почему выдается ошибка в выделенной строке
ошибка в выделенной строке E2061: Friends must be functions or classes #ifndef __MATRIX_H__ #define __MATRIX_H__ #include <stdexcept> template <class T> class Matrix { T* data; unsigned int rows; unsigned int cols; T* new_copy(const T* src, unsigned int src_size, unsigned int dst_size) { T* dest = new T[dst_size]; copy(src, src + src_size, dest); return dest; } public: Matrix(unsigned int _rows, unsigned int _cols): rows(_rows), cols(_cols) { data = new T[rows * cols]; } ~Matrix() { delete[] data; } Matrix(const Matrix& m): data(new_copy(m.data, *m.rows, *m.cols)), rows(m.rows), cols(m.cols){} Matrix& operator=(const Matrix& m) { if (this != &m) { T* temp = new_copy(m.data, *m.rows, *m.cols); delete[] data; data = temp; rows = m.rows; cols = m.cols; } return *this; } template<class U> class Helper { Matrix<U>& matrix; unsigned int i; Helper(Matrix<U>& _mc, unsigned int _i): matrix(_mc), i(_i) {}; Helper(const Matrix<U>& _mc, unsigned int _i): matrix(const_cast<Matrix&>(_mc)), i(_i) {}; Helper(const Helper&); Helper& operator=(const Helper&); friend class Matrix<U>; public: U& operator[](unsigned int k) { return matrix.data[matrix.cols * i + k]; } }; Helper<T> operator[](unsigned int i) { return Helper<T>(*this, i); } }; #endif //__MATRIX_H__ Заранее благодарна |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
1. Используйте тег "КОД" чтобы код можно было прочесть
2. Не используйте подчеркивания перед именами переменных и не используйте двойных подчеркиваний вообще. 3. Должно нормально компилироватся (во всяком случае эту ошибку он не должен выдавать) 4. Вы уверены что Helper и Matrix нужны разные типы шаблона? какой код вы компилируете и каким компилятором? покажите полный код с функцией main. этот
у меня скомпилировался без ошибок. Это сообщение отредактировал(а) azesmcar - 19.3.2009, 08:06 |
|||
|
||||
| Dimetra |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 19.3.2009 Репутация: нет Всего: нет |
azesmcar, программку надо написать на Билдере 5 а задачка, которую мне поставил руководитель, такая: есть файл f.dat: 4545 22 1 5 1 0.3 4 4 7 13 12.4 -3.2 0.9 5 5 5 5 12 8 4 3 12 3 7 7 7 5 5.5 3 12 3 4 5 7 9 0.57 5 7 5050 2 0.4 0.41 5 6 6 1 12 4.67 6.54 4 6 34 5 7.8 6 4 4 2 4545 4 0.12 0.96 9 7 8 9 9 4 3.4 1 2.8 6 6.1 4 7 8 5 12 4545 7 2 2 13 0.9 -2.3 5 8 6.99 -0.97 5.55 6.12 -3.01 6 4.14 12 12 0.42 5 0.21 0.43 7 13 5.12 3 8 6.43 -6.13 8.71 8.71 0.94 9.03 -12.11 3.14 3.01 -6.4 -6.007 0.71 -0.43 0.31 0.44 1.11 4 6 6 5.12 -0.12 6.74 123.5 8.1 -4.14 0.12 3.31 6.9 6.9 , где строки типа "4545 22", "5050 2" ,"4545 4" ,"4545 7"-своеобразные идентификаторы выделенные элементы-своеобразные пары ключей, которым привязаны следующие 16 элементов (некая матрица), то есть пара ключей (1 5) и привязанная к ним матрица 4х4 в виде строки (1 0.3 4 4 7 13 12.4 -3.2 0.9 5 5 5 5 12 8 4) ЗАДАЧА: надо разнести f.dat по новой матрице 2х2, где каждый элемент будет состоять как раз наборов (ключ1, ключ2) и соответствующей матрицей 4х4 то есть например в матрице М(2х2) элемент М[0][0] будет состоять из (1 5) <->1 0.3 4 4 7 13 12.4 -3.2 0.9 5 5 5 5 12 8 4 (3 12)<->3 7 7 7 5 5.5 3 12 3 4 5 7 9 0.57 5 7 Постаралсь обрисовать задачу полностью а о Ваших вопросах: 1- что-то я не поняла 2- подчеркивания можут вылиться в ошибки? 3- попроую, но сомневаюсь, что не будет выдавать ошибку :( 4- вроде нужны разные типы matrix.h #ifndef __MATRIX_H__ #define __MATRIX_H__ #include <stdexcept> template <class T> class Matrix { T* data; unsigned int rows; unsigned int cols; T* new_copy(const T* src, unsigned int src_size, unsigned int dst_size) { T* dest = new T[dst_size]; copy(src, src + src_size, dest); return dest; } public: Matrix(unsigned int _rows, unsigned int _cols): rows(_rows), cols(_cols) { data = new T[rows * cols]; } ~Matrix() { delete[] data; } Matrix(const Matrix& m): data(new_copy(m.data, *m.rows, *m.cols)), rows(m.rows), cols(m.cols){} Matrix& operator=(const Matrix& m) { if (this != &m) { T* temp = new_copy(m.data, *m.rows, *m.cols); delete[] data; data = temp; rows = m.rows; cols = m.cols; } return *this; } template<class U> class Helper { Matrix<U>& matrix; unsigned int i; Helper(Matrix<U>& _mc, unsigned int _i): matrix(_mc), i(_i) {}; Helper(const Matrix<U>& _mc, unsigned int _i): matrix(const_cast<Matrix&>(_mc)), i(_i) {}; Helper(const Helper&); Helper& operator=(const Helper&); friend class Matrix<U>; public: U& operator[](unsigned int k) { return matrix.data[matrix.cols * i + k]; } }; Helper<T> operator[](unsigned int i) { return Helper<T>(*this, i); } }; #endif //__MATRIX_H__ //main file matrix.cpp // Matrix.cpp : Defines the entry point for the console application. #include "Libb\Matrix.h" #include <iostream.h> #include <fstream.h> #include <map.h> #include <utility.h> #include <conio.h> #include <list.h> #include <vcl.h> const int SIGN_F = 4545; using namespace std; typedef pair<double, double> DoublePair;// para kluchey typedef Matrix<double> DoubleMatrix; //matrix 4x4 typedef map<DoublePair, DoubleMatrix > Inner; typedef Matrix<Inner> QMatrix; // need matrix Q=NxM=pair<tetta,fi> <=>Mueller matrix void check(const QMatrix& q) { cout << "---------- check -----------" << endl; for(int i = 0; i < 2; ++i) for(int k = 0; k < 2; ++k) { cout << "[" << i << "][" << k << "]:" << endl; const Inner& inn = q[i][k]; for(Inner::const_iterator it = inn.begin(); it != inn.end(); ++it) { for(int m = 0; m < 4; ++m) for(int n = 0; n < 4; ++n) cout << it->second[m][n] << " "; cout << endl; } cout << endl; } cout << "----------------------------" << endl; } void read(ifstream &fs, QMatrix& q, int row, int col) { DoublePair pair; // pair id1,id2 DoubleMatrix mx(4, 4); // matrix 4х4 Inner inner; //common structure with id1, id2 <=> matrix 4x4 int sign, index; int current_pos; fs >> sign >> index; while(!fs.eof()) { current_pos = fs.tellg(); fs >> sign; if (SIGN_F == sign) { fs.seekg(current_pos); q[row][col] = inner; return; } else { fs.seekg(current_pos); fs >> pair.first >> pair.second; for(int i = 0; i < 4; ++i) for(int k = 0; k < 4; ++k) fs >> mx[i][k]; inner.insert(make_pair(pair, mx)); } } q[row][col] = inner; } int main(int argc, char* argv[]) { ifstream file("f.dat"); if (file.fail()) { cout << "Unable open file!" << endl; return -1; } QMatrix Q(2, 2); for(int row = 0; row < 2; ++row) for(int col = 0; col < 2; ++col) { read(file, Q, row, col); } check(Q); getch(); return 0; } ЗАРАНЕЕ СЕНКС за будущий Help Добавлено через 3 минуты и 22 секунды
А Вы наверное компилировали на, например, MSVC++ 2005, что у не возникло проблем...там компилируется и нормально отрабатывает код, но надо на Билдере :( |
||||||||
|
|||||||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
1. На форуме, когда отправляете какой нибудь source, сверху есть кнопка "Код", нажмите ее предварительно выделив. Отредактируйте сейчас, а то читать невозможно. 2. Могут, подчеркивания перед переменными и двойные подчеркивания зарезервированы для внутреннего использования (например для СТЛ). Не знаю как насчет билдера, не могу попробовать тем более пятой версией..но с обявлением френда тут ошибок не вижу. Все нормально. Это сообщение отредактировал(а) azesmcar - 19.3.2009, 08:46 |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 8 Всего: 56 |
listen в your коде нет errors заченжи свой compiler и енжойся |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
как билдер реагирует на этот код? проверьте |
|||
|
||||
| Dimetra |
|
||||||||||||||||||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 19.3.2009 Репутация: нет Всего: нет |
на этот код он реагирует нормально-все компилируется Добавлено через 1 минуту и 31 секунду
Подскажите, на какой compiler его заменить и где его взять Добавлено через 4 минуты и 3 секунды
azesmcar, программку надо написать на Билдере 5 а задачка, которую мне поставил руководитель, такая: есть файл f.dat: 4545 22 1 5 1 0.3 4 4 7 13 12.4 -3.2 0.9 5 5 5 5 12 8 4 3 12 3 7 7 7 5 5.5 3 12 3 4 5 7 9 0.57 5 7 5050 2 0.4 0.41 5 6 6 1 12 4.67 6.54 4 6 34 5 7.8 6 4 4 2 4545 4 0.12 0.96 9 7 8 9 9 4 3.4 1 2.8 6 6.1 4 7 8 5 12 4545 7 2 2 13 0.9 -2.3 5 8 6.99 -0.97 5.55 6.12 -3.01 6 4.14 12 12 0.42 5 0.21 0.43 7 13 5.12 3 8 6.43 -6.13 8.71 8.71 0.94 9.03 -12.11 3.14 3.01 -6.4 -6.007 0.71 -0.43 0.31 0.44 1.11 4 6 6 5.12 -0.12 6.74 123.5 8.1 -4.14 0.12 3.31 6.9 6.9 , где строки типа "4545 22", "5050 2" ,"4545 4" ,"4545 7"-своеобразные идентификаторы выделенные элементы-своеобразные пары ключей, которым привязаны следующие 16 элементов (некая матрица), то есть пара ключей (1 5) и привязанная к ним матрица 4х4 в виде строки (1 0.3 4 4 7 13 12.4 -3.2 0.9 5 5 5 5 12 8 4) ЗАДАЧА: надо разнести f.dat по новой матрице 2х2, где каждый элемент будет состоять как раз наборов (ключ1, ключ2) и соответствующей матрицей 4х4 то есть например в матрице М(2х2) элемент М[0][0] будет состоять из (1 5) <->1 0.3 4 4 7 13 12.4 -3.2 0.9 5 5 5 5 12 8 4 (3 12)<->3 7 7 7 5 5.5 3 12 3 4 5 7 9 0.57 5 7 Постаралсь обрисовать задачу полностью а о Ваших вопросах: 1- что-то я не поняла 2- подчеркивания можут вылиться в ошибки? 3- попроую, но сомневаюсь, что не будет выдавать ошибку :( 4- вроде нужны разные типы
//main file matrix.cpp /
ЗАРАНЕЕ СЕНКС за будущий Help Добавлено через 5 минут и 34 секунды
подчеркивания убрала и все равно не компилируется :(...те же ошибки |
||||||||||||||||||
|
|||||||||||||||||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
а как насчет этого? попробуйте вывести свой класс Helper за пределы класса Matrix. Компиляторов нормальных множество. Посмотрите тут http://forum.vingrad.ru/forum/topic-49632.html а кстати почему код без подсветки, и не надо дублировать сообщения. Есть кнопка редактировать. ![]() и для кода |
|||
|
||||
| Dimetra |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 19.3.2009 Репутация: нет Всего: нет |
1-я посмотрела по ссылке на компиляторы...они все платные что ли??? или у меня совсем тугос пониманием тезнического английского?:(
2-по Вашему примеру я попробывала скомпилировать matrix.cpp (matrix.h без изменений) , в таком виде
и все ок! но если я добавила выделенную строку-то он уже начинает ругаться , что E2061: friends must be functions or classes...может Вам стало понятно ПОЧЕМУ? :(
return 0; } 3-а вытащить class Helper за пределы class Matrix с шаблонами это как? |
||||
|
|||||
| azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
нет, практически все бесплатные. Наверное только Визуал С++, и то даже микрософт уже бесплатную версию компилятора выпустил для студентов - http://www.microsoft.com/Express/ проблема тут с компилятором, смените его и все будет в порядке..я просто пытаюсь понять что именно не хочет билдер компилировать. Добавлено через 38 секунд
а в чем проблема? вы же не используете параметр шаблона класса Matrix в классе Helper. |
||||
|
|||||
| Dimetra |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 19.3.2009 Репутация: нет Всего: нет |
так я же потом изпользую объявленный Helper потом в Matrix
|
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |