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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
D_Ok
44 / 33 / 12
Регистрация: 11.02.2014
Сообщений: 134
#1

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

05.03.2014, 12:32. Просмотров 338. Ответов 8
Метки нет (Все метки)

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; то все норм.
что здесь не так, почему компилятор пытается конвертировать данные одного типа?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.03.2014, 12:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Template, в чем ошибка? (C++):

В чем различие template <typename T> от template <class T> ? - C++
Добрый день ! Заметил в новых книгах применение записи template &lt;typename T&gt; вместо template &lt;class T&gt; в чем же тогда фишка...

Ошибка компиляции: template-id does not match any template declaration - C++
Здравствуйте. Помогите, пожалуйста: #include &lt;iostream&gt; using namespace std; template &lt;typename T&gt; T maxn(T*, const int*); ...

Ошибки: 1) use of class template requires template argument list 2) 'T' : undeclared identifier - C++
Решил подправить свой класс с использованием шаблонов, но столкнулся со следующим косяком. Если я прописываю тело функций внутри описания...

'MyQueue' : use of class template requires template argument list - C++
Написал код про шаблоны. Не могу понять почему выводит ошибку во время наследования класса. ошибки 'MyQueue' : use of class template...

Ошибка с template - C++
Доброго всем дня. Не смог толком придумать правильный заголовок, а суть проблемы такая: Есть темплейт функции в отдельном файле,...

Visual Studio выдаёт ошибку при вынесении объявления функции с template в .h файл. Без template всё работает - C++
Проект содержит три файла: Source.cpp, arrTreat.h, arrTreat.cpp. Source.cpp: #include &lt;iostream&gt; using std::cout; using...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
scenotaph
120 / 120 / 15
Регистрация: 29.03.2013
Сообщений: 237
05.03.2014, 13:20 #2
Вам нужно передавать в функцию матрицу, а вы её передаёте как переменную типа T.
Alex5
1052 / 715 / 105
Регистрация: 12.04.2010
Сообщений: 1,810
05.03.2014, 13:50 #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
7089 / 4230 / 950
Регистрация: 30.01.2014
Сообщений: 7,006
05.03.2014, 14:36 #4
Цитата Сообщение от Alex5 Посмотреть сообщение
без вспомогательной переменной
К сожалению этот трюк бесполезен на большинстве современных систем (ключевое слово - многоядерность).
Но знать надо, да. Может пригодиться.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
05.03.2014, 15:27 #5
Цитата Сообщение от DrOffset Посмотреть сообщение
бесполезен на большинстве современных систем (ключевое слово - многоядерность).
какая связь битовых операций с ядрёностью в данном контексте?
D_Ok
44 / 33 / 12
Регистрация: 11.02.2014
Сообщений: 134
05.03.2014, 15:40  [ТС] #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
Модератор
Эксперт С++
6358 / 5922 / 1919
Регистрация: 18.12.2011
Сообщений: 15,218
Завершенные тесты: 1
05.03.2014, 16:07 #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
1052 / 715 / 105
Регистрация: 12.04.2010
Сообщений: 1,810
05.03.2014, 16:21 #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, в чем ошибка?  
DrOffset
7089 / 4230 / 950
Регистрация: 30.01.2014
Сообщений: 7,006
05.03.2014, 16:48 #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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.03.2014, 16:48
Привет! Вот еще темы с ответами:

<Template>. Ошибка компиляции - C++
Пытаюсь сделать Темплате Array, который бы принимал класс Point. Объект класса Point состоит из 2х точек координаты x и y. Мне надо...

Template ошибка компляции - C++
Здравствуйте, есть код, при реализации класса пишет ошибку-невозможно разрешить идентификатор T,U,Z template&lt;class T, class U, class Z&gt; ...

Ошибка с template <class T> - C++
Доброго времени суток! Изучаю С++ и не совсем разобрался с template. Вернее, я думаю, что понял, но компилятору виднее. В общем, он...

Ошибка: 'StackIter' is not a template type - C++
Не компилируется. C:\Qt\Qt5.3.2\Tools\QtCreator\bin\ex7\iterator.hpp:31: ошибка: 'StackIter' is not a template type ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
05.03.2014, 16:48
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru