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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 5.00
kravam
быдлокодер
1697 / 884 / 45
Регистрация: 04.06.2008
Сообщений: 5,474
#1

Почему нельзя объявить указатель на шаблонную структуру? - C++

03.06.2011, 19:26. Просмотров 1740. Ответов 13
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
template <class T>
typedef struct per {
 T znach; 
 int kol_vo_povt;
}* p;
 
 
int main() {
 per<int> k;
}
Не компилится, а всё из-за указателя, уберём его объявление
C++
1
2
3
4
5
6
7
8
9
10
template <class T>
typedef struct per {
 T znach; 
 int kol_vo_povt;
};
 
 
int main() {
 per<int> k;
}
И всё скомпилится. Помогите, ребята, а?
Уж под указатель-то g++ мог бы место выделить, небось больше четырёх байт не займёт...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.06.2011, 19:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему нельзя объявить указатель на шаблонную структуру? (C++):

Указатель на шаблонную структуру - C++
Здравствуйте! Имеется шаблонная структура Value. Создаю класс Container, в котором хочу создать указатель на объект типа Value. Как...

Объявить указатель на структуру внутри структуры - C++
Объявить указатель на структуру внутри структуры. Добавлено через 5 часов 24 минуты Просто отрывок кода.

Почему нельзя так объявить двумерный массив? - C++
Ошибка возникает если для массива tempArray при объявлении(и одновременной инициализации) использовать переменную(size) которую принимает...

Почему нельзя объявить динамический массив глобально - C++
вот код #include &lt;iostream&gt; #include &lt;string&gt; int w = 0; string *s = new string ; using namespace std; int main { ...

Почему нельзя объявить в описание класса статический double? - C++
Ближе к делу :) class SuperClass { public: SuperClass() {} static const int A = 0; static const double B = 0; //ERROR*...

Передача массива через указатель в шаблонную функцию - C++
Здравствуйте. В общем есть шаблонный класс List, который является двусвязным списком: template &lt;class Type&gt; class List { ...

13
Kastaneda
Форумчанин
Эксперт С++
4656 / 2864 / 228
Регистрация: 12.12.2009
Сообщений: 7,276
Записей в блоге: 2
Завершенные тесты: 1
03.06.2011, 19:44 #2
Все дело в арифметике указателей. На сколько должен увеличится указатель при p++ ?
Поэтому нужно делать вот так:
C++
1
per<int> *p;
1
OstapBender
583 / 522 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
03.06.2011, 19:44 #3
VS:
"error C2823: a typedef template is illegal"

убрал typedef - всё работает хоть с указателем хоть без
0
pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
03.06.2011, 19:48 #4
Цитата Сообщение от Kastaneda Посмотреть сообщение
На сколько должен увеличится указатель при p++
на 4 байта на 32-х битной системе, на 8 на 64-х?
0
OstapBender
583 / 522 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
03.06.2011, 19:50 #5
Цитата Сообщение от pito211 Посмотреть сообщение
на 4 байта на 32-х битной системе, на 8 на 64-х?
указатель изменяется на столько сколько занимает тип на который он указывает, а не сколько занимает сам указатель
0
kravam
быдлокодер
1697 / 884 / 45
Регистрация: 04.06.2008
Сообщений: 5,474
05.06.2011, 21:15  [ТС] #6
Так, а если размер структуры известен, значит, можно и указатель объявить? Но нельзя, получается. Почему?
C++
1
2
3
4
5
6
7
8
9
10
template <class T>
typedef struct element {
 T* s; 
 element* adres_levogo;
 element* adres_pravogo;
 int kolichestvo;
}* p;
 
int main() {
}
4+4+4+4= 16 байт.
Я пока вышел из положения так: все указатели пообъявлял void* и всё компилится. (Правда, мне ещё голову ломать, как потом привести void* к указателю на нужный мне тип.)

Добавлено через 5 минут
Торможу жёстко, s++ некорректная ведь операция...
0
kravam
быдлокодер
1697 / 884 / 45
Регистрация: 04.06.2008
Сообщений: 5,474
28.08.2011, 17:49  [ТС] #7
ОК, а почему это не компилится?
C++
1
2
3
4
5
6
7
template <class T>
struct element {
 int k;
}* p;
 
int main() {
}
Методом научного тыка я понял, что всё дело в
C++
1
template <class T>
то есть если мы используем шаблон, то компилятор (g++) автоматом бракует все объявления указателей, хотя бы даже и был известен размер структуры, угу? (то, что можно спокойно обойтись и без template <class T> в данном примере- это неважно, тут постигается логика компилятора)
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
28.08.2011, 20:03 #8
В любом случае, такая запись
C++
1
2
3
4
template <class T>
struct element {
 int k;
}* p;
это пережиток прошлого. Не нужно так писать в С++.
0
kravam
быдлокодер
1697 / 884 / 45
Регистрация: 04.06.2008
Сообщений: 5,474
28.08.2011, 20:07  [ТС] #9
Вы мне очень помогли. Снизойдите, напишите уж, как нужно писать...
0
fasked
Эксперт С++
4942 / 2522 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
28.08.2011, 20:12 #10
Цитата Сообщение от kravam Посмотреть сообщение
Я пока вышел из положения так: все указатели пообъявлял void* и всё компилится. (Правда, мне ещё голову ломать, как потом привести void* к указателю на нужный мне тип.)
Ничего себе вышел из положения
Один вопрос: зачем typedef для структуры в этом случае?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
// struct's typedef in C++ has no value
template <typename T> 
struct element {
    T data;
};
 
// typedef should be defined like this 
typedef element<int> element_int;
 
// global variables should be defined like this
element<int> elem;
 
// ... or like this using typedef
element_int *element_pointer = &elem;
 
int main() {
   element_pointer->data = 5;
   std::cout << element_pointer->data;
}
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
28.08.2011, 20:16 #11
Цитата Сообщение от kravam Посмотреть сообщение
Вы мне очень помогли.
Там создаётся указатель на неизвестный тип. Этого делать нельзя, на что компилятор и намекает.
Если убрать шаблон, то тип становится известен и указатель создать можно, но такая запись характерна для Си, в С++ не стоит так писать. Это объединение абсолютно разных явлений: Объявление типа и объявление переменной. Не стоит это смешивать.
0
fasked
Эксперт С++
4942 / 2522 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
28.08.2011, 20:19 #12
Цитата Сообщение от Deviaphan Посмотреть сообщение
Это объединение абсолютно разных явлений: Объявление типа и объявление переменной. Не стоит это смешивать.
Судя по typedef автор хотел объвить синоним типу указателя на шаблонный класс.
Цитата Сообщение от Deviaphan Посмотреть сообщение
но такая запись характерна для Си, в С++ не стоит так писать
На самом деле и в Си так делать не надо
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
28.08.2011, 20:24 #13
Цитата Сообщение от fasked Посмотреть сообщение
Судя по typedef автор хотел объвить синоним типу указателя на шаблонный класс.
Только вот тип на тот момент не известен ещё... пичалька.)

Цитата Сообщение от fasked Посмотреть сообщение
и в Си так делать не надо
Старого Сишника только могила исправит.
0
easybudda
Модератор
Эксперт CЭксперт С++
9664 / 5614 / 952
Регистрация: 25.07.2009
Сообщений: 10,778
28.08.2011, 21:02 #14
fasked, в принципе уже показал, как надо, к тому же в С++ при наличии контейнеров, итераторов и прочих благ цивилизации указателями без крайней на то нужды вроде бы лучше и не пользоваться, но раз уж написал...
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>
 
template <typename T>
class AnyType {
    T val;
    size_t cnt;
public:
    void set(const T & _val, size_t _cnt){
        val = _val;
        cnt = _cnt;
    }
    T Val() const {
        return val;
    }
    size_t Cnt() const {
        return cnt;
    }
};
 
typedef AnyType<double> DoubleType;
typedef AnyType<int> IntType;
 
int main(){
    const int size(10);
    
    DoubleType DoubleArr[size], * DTPtr;
    for ( DTPtr = DoubleArr; DTPtr < DoubleArr + size; ++DTPtr )
        DTPtr->set(1.0 / 2.0, 13); // просто лень было разнообразием заморачиваться...
    
    IntType IntArr[size], * ITPtr;
    for ( ITPtr = IntArr; ITPtr < IntArr + size; ++ITPtr )
        ITPtr->set(69, 73);
    
    for ( int i = 0; i < size; ++i )
        std::cout << "DoubleArray[" << i << "] : " << DoubleArr[i].Val() << "\t" << DoubleArr[i].Cnt() << "\n"
            << "IntArray[" << i << "] : " << IntArr[i].Val() << "\t" << IntArr[i].Cnt() << std::endl;
    
    return 0;
}
Цитата Сообщение от fasked Посмотреть сообщение
На самом деле и в Си так делать не надо
Ну и с этим не поспоришь...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.08.2011, 21:02
Привет! Вот еще темы с ответами:

Ввод данных в структуру через указатель на структуру - C++
#include &quot;stdafx.h&quot; #include &quot;ctime&quot; #include &quot;iostream&quot; #pragma warning(disable : 4996) using namespace std; class...

Не знаю как объявить указатель! - C++
Нужно ввести указатель ptr, чтобы он изначально указывал на голову двусвязного списка. Не знаю как это сделать, постоянно ошибками сыплет. ...

Как объявить указатель на массив? - C++
Читаю книгу С.Прата, наткнулся на это: short (*pas) = &amp;tell; // pas указывает на массив из 20 элементов short Если опустить круглые...

Почему указатель на указатель объявляется как float **A; - C++
Почему float?


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

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

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