Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
Заблокирован
1

Ошибка при создании шаблонной функции:"error C2075: temp: для инициализации массива требуются фигурные скобки"

29.07.2014, 18:53. Просмотров 1537. Ответов 15
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
template <typename T> int GnomeSort(T* p, int length)
{
    int i, count;
 
    i = 0;
    count = 0;
 
    while(i < length)
    {
        if(i == 0 || p[i] >= p[i - 1]) ++i;
        else
        {
            T temp = p[i - 1];
            p[i - 1] = p[i];
            p[i] = temp;
            --i;
        }
 
        count++;
    }
 
    return count;
}
Здравствуйте, прошу помощи, почему не работает код. Проект собирал в "MicroSoft Visual Studio 2010".
Ошибка 1 error C2075: temp: для инициализации массива требуются фигурные скобки c:\documents and settings\admin\мои документы\visual studio 2010\projects\test\test\main.cpp 29
Ошибка 2 error C2106: =: левый операнд должен быть левосторонним значением c:\documents and settings\admin\мои документы\visual studio 2010\projects\test\test\main.cpp 30
Ошибка 3 error C2106: =: левый операнд должен быть левосторонним значением c:\documents and settings\admin\мои документы\visual studio 2010\projects\test\test\main.cpp 31
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.07.2014, 18:53
Ответы с готовыми решениями:

Ошибка "Runtime error" при создании массива
помогите плиз, у меня задачка &quot;создать из 2х одномерных массивов один одномерный массив, в котором...

Ошибка "MySQL error 1044: access denied" при создании таблицы

Фигурные скобки и точка с запятой в языках с "сишным" синтаксисом
Если блок кода отформатирован правильно, то компилятор и без них мог бы понять код. Если блок кода...

Фигурные скобки в коде "где ни попадя"
Сижу разбираю чужой код. Сижу и диву даюсь - местами, без видимой на то причины часть кода...

15
Эксперт С++
4958 / 3064 / 456
Регистрация: 10.11.2010
Сообщений: 11,152
Записей в блоге: 10
29.07.2014, 18:56 2
В качестве T какой тип выступает?
0
Заблокирован
29.07.2014, 19:08  [ТС] 3
Пробовал с "string" и "int", ошибки одинаковые.
0
12707 / 6915 / 1663
Регистрация: 30.01.2014
Сообщений: 11,558
29.07.2014, 19:12 4
Stason676, код из main.cpp тоже покажи пожалуйста.
0
Заблокирован
29.07.2014, 19:13  [ТС] 5
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
#include <iostream>
#include <string>
 
template <typename T> int GnomeSort(T*, int);
 
int main(int argc, char* argv[])
{
    std::string s = "23451";
    int count = GnomeSort(&s, 5);
 
    int a[5] = { 2, 3, 4, 5, 1 };
    int count2 = GnomeSort(&a, 5);
 
    return 0;
}
 
template <typename T> int GnomeSort(T* p, int length)
{
    int i, count;
 
    i = 0;
    count = 0;
 
    while(i < length)
    {
        if(i == 0 || p[i] >= p[i - 1]) ++i;
        else
        {
            T temp = p[i];
            p[i] = p[i - 1];
            p[i - 1] = temp;
            --i;
        }
 
        count++;
    }
 
    return count;
}
0
Эксперт С++
4958 / 3064 / 456
Регистрация: 10.11.2010
Сообщений: 11,152
Записей в блоге: 10
29.07.2014, 19:16 6
Первый вариант не сработает. Во втором убери амперсанд (&).
1
Заблокирован
29.07.2014, 19:19  [ТС] 7
Почему?
0
Эксперт С++
4958 / 3064 / 456
Регистрация: 10.11.2010
Сообщений: 11,152
Записей в блоге: 10
29.07.2014, 19:21 8
Потому что передастся указатель на string, по этому указателю только в p[0] будет валидный элемент.
1
Заблокирован
29.07.2014, 19:27  [ТС] 9
Возможно ли написать шаблон для сортировки всего. Спасибо.
0
3208 / 2651 / 716
Регистрация: 25.03.2012
Сообщений: 9,571
Записей в блоге: 1
29.07.2014, 19:31 10
Stason676, так ты и написал шаблон для сортировки всех массивов! Но string это не массив же!
1
Эксперт С++
4958 / 3064 / 456
Регистрация: 10.11.2010
Сообщений: 11,152
Записей в блоге: 10
29.07.2014, 19:38 11
Вот такую строку можно отсортировать твоим алгоритмом:
C++
1
2
char str[] = "jdurbfofywn";
GnomeSort( &str[0], strlen( str ) );
1
12707 / 6915 / 1663
Регистрация: 30.01.2014
Сообщений: 11,558
29.07.2014, 19:38 12
Цитата Сообщение от castaway Посмотреть сообщение
по этому указателю только в p[0] будет валидный элемент.
Причем и это не факт.
1
Эксперт С++
4958 / 3064 / 456
Регистрация: 10.11.2010
Сообщений: 11,152
Записей в блоге: 10
29.07.2014, 19:44 13
DrOffset, почему?
1
12707 / 6915 / 1663
Регистрация: 30.01.2014
Сообщений: 11,558
29.07.2014, 19:59 14
Цитата Сообщение от castaway Посмотреть сообщение
DrOffset, почему?
Да меня переклинило чего-то. Почему-то подумал про вот такой хак:
C++
1
2
3
4
5
6
7
8
9
10
#include <string>
 
int main ()
{
    std::string str = "test";
 
    char * p = (char*)&str;
 
    std::cout << p[0];
}
пару раз встречал такое, использовалось в расчете на то, что внутренний буфер расположен в самом начале класса.
Иногда там могут быть данные, но чаще всего там мусор, ибо зависит от многих вещей, выравнивания, оптимизации, способа организации внутренностей std::string и т.п.
В общем - штанга. Я только с работы, еще в своих мыслях
1
Заблокирован
30.07.2014, 15:11  [ТС] 15
Всем спасибо за ответы!
0
710 / 282 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
30.07.2014, 15:43 16
Цитата Сообщение от Stason676 Посмотреть сообщение
Возможно ли написать шаблон для сортировки всего. Спасибо.
Возможно ( ну, т.е. конечно не всего, а только того, что обладает семантикой массивов, т.е. имеет operator[] ). Надо лишь сделать небольшие изменения:

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
#include <iostream>
#include <string>
 
template <typename T> int GnomeSort( T&, int );
 
int main( int argc, char* argv[] ) {
  std::string s = "23451";
  int count = GnomeSort( s, 5 );
 
  int a[ 5 ] = { 2, 3, 4, 5, 1 };
  int count2 = GnomeSort( a, 5 );
 
  return 0;
}
 
template <typename T> 
int GnomeSort( T& p, int length ) {
  int i = 0;
  int count = 0;
 
  while( i < length ) {
    if( i == 0 || p[ i ] >= p[ i - 1 ] ) ++i;
    else {
      auto temp = p[ i ];
      p[ i ] = p[ i - 1 ];
      p[ i - 1 ] = temp;
      --i;
    }
 
    count++;
  }
 
  return count;
}
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Но string это не массив же!
Ну это как посмотреть, для данного алгоритма вполне себе массив
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.07.2014, 15:43

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Ошибка при компиляции "Syntax error "Begin" expected but ";" found"
При компиляции выдаёт ошибку &quot;Syntax error &quot;Begin&quot; expected but &quot;;&quot; found&quot; в блоке Procedure...

Ошибка при создании массива "Access violation. Link terminated"
создается массивы float X, Y, Z, E,F,Fan; все отлично но при попытке увеличить размер до...

При создании нового файла "*.mdb" возникает "ошибка связи с сервером OLE"
При создании нового файла &quot;*.mdb&quot; &quot;ошибка связи с сервером OLE&quot;. Выскакивают окна Окно 1...

Ошибка при компиляции: "error C2447: {: отсутствует заголовок функции"
Ошибка 1 error C2447: {: отсутствует заголовок функции (возможно, используется формальный список...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

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