Форум программистов, компьютерный форум CyberForum.ru

Template, в чем ошибка? - C++

Восстановить пароль Регистрация
 
D_Ok
43 / 32 / 12
Регистрация: 11.02.2014
Сообщений: 134
05.03.2014, 12:32     Template, в чем ошибка? #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
#include <ctime>
#include <iomanip>
using namespace std;
template <typename T>
void Fill(T matrix, int row, int col)
{
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j <col; j++)
            matrix[i][j] = rand()%256 + rand()%100 / 100.0;
    }
}
template <typename T>
void Print(T matrix, int row, int col)
{
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j <col; j++)
            cout << setw(8) << matrix[i][j];
        cout <<endl;
    }
}
template <typename T>
void Reverse_col(T matrix, int row, int col)
{
    T temp;
    for (int i = 0; i < row; i++)
    {
        for (int j = 0, k = col-1; j <col/2; j++)
        {
            temp = matrix[i][j];
            matrix[i][j] = matrix[i][k];
            matrix[i][k] = temp;
            k--;
        }
    }
}
int main()
{
    srand(unsigned(time(NULL)));
    const int ROW = 4, COL = 6;
    char matrix[ROW][COL];
    Fill(matrix, ROW, COL);
    Print(matrix, ROW, COL);
    cout << endl;
    Reverse_col(matrix, ROW, COL);
    Print(matrix, ROW, COL);
    return 0;
}
Если в Reverse_col объявляю переменную T temp; то выдает ошибку:
Error 2 error C2440: '=' : cannot convert from 'char' to 'char (*)[6]'
Error 3 error C2440: '=' : cannot convert from 'char (*)[6]' to 'char'
если объявляю double temp; то все норм.
что здесь не так, почему компилятор пытается конвертировать данные одного типа?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
scenotaph
120 / 120 / 15
Регистрация: 29.03.2013
Сообщений: 237
05.03.2014, 13:20     Template, в чем ошибка? #2
Вам нужно передавать в функцию матрицу, а вы её передаёте как переменную типа T.
Alex5
883 / 618 / 81
Регистрация: 12.04.2010
Сообщений: 1,552
05.03.2014, 13:50     Template, в чем ошибка? #3
Цитата Сообщение от D_Ok Посмотреть сообщение
C++
1
2
3
4
5
6
template <typename T>
void Reverse_col(T matrix, int row, int col)
{
 T temp;
 // ... 
 temp = matrix[i][j];
T здесь двойной массив, например char[][6]. matrix[i][j] - элемента массива, например имеет тип char. Получается, Вы пытаетесь двойному массиву char[][6] присвоить значение типа char.
Вот аналогичный пример.
C++
1
2
    int a[7][8], b[7][8];
    a = b[0][0]; /* error C2440: =: невозможно преобразовать 'int' в 'int [7][8]' */
Добавлено через 24 минуты
Можно обойтись без вспомогательной переменной (для переменных целого типа).
C++
1
2
3
4
5
6
7
// поменять местами значения a и b 
if( &a != &b )
{
  a ^= b;
  b ^= a;
  a ^= b;
}
DrOffset
6456 / 3830 / 885
Регистрация: 30.01.2014
Сообщений: 6,626
05.03.2014, 14:36     Template, в чем ошибка? #4
Цитата Сообщение от Alex5 Посмотреть сообщение
без вспомогательной переменной
К сожалению этот трюк бесполезен на большинстве современных систем (ключевое слово - многоядерность).
Но знать надо, да. Может пригодиться.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
05.03.2014, 15:27     Template, в чем ошибка? #5
Цитата Сообщение от DrOffset Посмотреть сообщение
бесполезен на большинстве современных систем (ключевое слово - многоядерность).
какая связь битовых операций с ядрёностью в данном контексте?
D_Ok
43 / 32 / 12
Регистрация: 11.02.2014
Сообщений: 134
05.03.2014, 15:40  [ТС]     Template, в чем ошибка? #6
Цитата Сообщение от Alex5 Посмотреть сообщение
T здесь двойной массив, например char[][6].
а если так:
C++
1
2
template <typename T>
void Reverse (T matrix[][6])
T сейчас имеет тип такой же как, элемент матрицы? Ибо так все работает при T temp;

Добавлено через 12 минут
и еще, при таком объявление :
C++
1
2
template <typename T>
void Reverse (T matrix[][6])
что передается, первый элемент матрицы или его адрес?
и что тогда при таком:
C++
1
2
template <typename T>
void Reverse (T matrix)
zss
Модератор
Эксперт С++
 Аватар для zss
5948 / 5553 / 1785
Регистрация: 18.12.2011
Сообщений: 14,191
Завершенные тесты: 1
05.03.2014, 16:07     Template, в чем ошибка? #7
Думаю, правильнее параметр шаблона использовать как тип,
а размеры массива передавать через константные параметры шаблона:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <iostream>
#include <ctime>
#include <iomanip>
using namespace std;
template <typename T,int row,int col>
void Fill(T **matrix)
{
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j <col; j++)
            matrix[i][j] = rand()%256 + rand()%100 / 100.0;
    }
}
template <typename T,int row,int col>
void Print(T **matrix)
{
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j <col; j++)
            cout << setw(8) << matrix[i][j];
        cout <<endl;
    }
}
template <typename T,int row,int col>
void Reverse_col(T **matrix)
{
   T temp;
    for (int i = 0; i < row; i++)
    {
        for (int j = 0, k = col-1; j <col/2; j++)
        {
            temp = matrix[i][j];
            matrix[i][j] = matrix[i][k];
            matrix[i][k] = temp;
            k--;
        }
    }
}
int main()
{
    srand(unsigned(time(NULL)));
    const int ROW = 5, COL = 6;
    double **matrix;
    matrix=new double*[ROW];
    for(int i=0;i<ROW;i++)
        matrix[i]=new double[COL];
    Fill<double,ROW,COL>(matrix);
    Print<double,ROW,COL>(matrix);
    cout << endl;
    Reverse_col<double,ROW,COL>(matrix);
    Print<double,ROW,COL>(matrix);
    for(int i=0;i<ROW;i++)
        delete[] matrix[i];
    delete[] matrix;
    system("pause");
    return 0;
}
Alex5
883 / 618 / 81
Регистрация: 12.04.2010
Сообщений: 1,552
05.03.2014, 16:21     Template, в чем ошибка? #8
Цитата Сообщение от D_Ok Посмотреть сообщение
что передается, первый элемент матрицы или его адрес?
Это определяется той строкой, где производится вызов функции. (В случае массива передаётся указатель на его начало.)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <typeinfo>
using namespace std;
 
template< typename T >
void F( T t )
{
    cout << " typeid(t).name() : " << typeid(t).name() << endl;
}
 
int main()
{
    const int ROW = 4, COL = 6;
    char matrix[ROW][COL];
 
    F( matrix ); /* здесь массив ( двойной ) */
    F( matrix[0] );  /* тоже массив - первая строка матрицы */
    F( matrix[0][0] );
 
    return 0;
}
Миниатюры
Template, в чем ошибка?  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.03.2014, 16:48     Template, в чем ошибка?
Еще ссылки по теме:

ошибка -template argument 1 is invalid C++
Ошибка с template <class T> C++
'MyQueue' : use of class template requires template argument list C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
DrOffset
6456 / 3830 / 885
Регистрация: 30.01.2014
Сообщений: 6,626
05.03.2014, 16:48     Template, в чем ошибка? #9
Цитата Сообщение от Tulosba Посмотреть сообщение
какая связь битовых операций с ядрёностью в данном контексте?
Ага, думал про одно, а написал про другое Сама по себе ядреность не важна, я хотел сказать о конвейерной обработке и возможном распараллеливании инструкций через нее. В этом случае, когда результат каждой следующей операции зависит от предыдущей, мы лишимся этой этй возможности.

Не по теме:

замечание правомерно, спасибо.



Добавлено через 15 минут
Цитата Сообщение от zss Посмотреть сообщение
Думаю, правильнее параметр шаблона использовать как тип,
а размеры массива передавать через константные параметры шаблона
Тогда уж лучше так:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <iomanip>
using namespace std;
template <typename T, size_t R, size_t C>
void Fill(T (&matrix)[R][C])
{
    for (size_t i = 0; i < R; i++)
    {
        for (size_t j = 0; j < C; j++)
            matrix[i][j] = rand()%256 + rand()%100 / 100.0;
    }
}
template <typename T, size_t R, size_t C>
void Print(T const (&matrix)[R][C])
{
    for (size_t i = 0; i < R; i++)
    {
        for (size_t j = 0; j < C; j++)
            cout << setw(8) << matrix[i][j];
        cout <<endl;
    }
}
template <typename T, size_t R, size_t C>
void Reverse_col(T (&matrix)[R][C])
{
    T temp;
    for (size_t i = 0; i < R; i++)
    {
        for (size_t j = 0, k = C-1; j <C/2; j++)
        {
            temp = matrix[i][j];
            matrix[i][j] = matrix[i][k];
            matrix[i][k] = temp;
            k--;
        }
    }
}
 
int main()
{
    srand(unsigned(time(NULL)));
    const size_t ROW = 4, COL = 6;
    char matrix[ROW][COL];
    Fill(matrix);
    Print(matrix);
    cout << endl;
    Reverse_col(matrix);
    Print(matrix);
    return 0;
}
Yandex
Объявления
05.03.2014, 16:48     Template, в чем ошибка?
Ответ Создать тему
Опции темы

Текущее время: 17:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru