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

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

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

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

03.06.2011, 19:26. Просмотров 1722. Ответов 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++ мог бы место выделить, небось больше четырёх байт не займёт...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.06.2011, 19:26     Почему нельзя объявить указатель на шаблонную структуру?
Посмотрите здесь:
Указатель на шаблонную структуру C++
Объявить указатель на структуру внутри структуры C++
C++ Почему нельзя так объявить двумерный массив?
Почему нельзя объявить динамический массив глобально C++
Почему нельзя объявить в описание класса статический double? C++
C++ Передача массива через указатель в шаблонную функцию
Ввод данных в структуру через указатель на структуру C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Форумчанин
Эксперт С++
4514 / 2856 / 228
Регистрация: 12.12.2009
Сообщений: 7,249
Записей в блоге: 1
Завершенные тесты: 1
03.06.2011, 19:44     Почему нельзя объявить указатель на шаблонную структуру? #2
Все дело в арифметике указателей. На сколько должен увеличится указатель при p++ ?
Поэтому нужно делать вот так:
C++
1
per<int> *p;
OstapBender
583 / 521 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
03.06.2011, 19:44     Почему нельзя объявить указатель на шаблонную структуру? #3
VS:
"error C2823: a typedef template is illegal"

убрал typedef - всё работает хоть с указателем хоть без
pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
03.06.2011, 19:48     Почему нельзя объявить указатель на шаблонную структуру? #4
Цитата Сообщение от Kastaneda Посмотреть сообщение
На сколько должен увеличится указатель при p++
на 4 байта на 32-х битной системе, на 8 на 64-х?
OstapBender
583 / 521 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
03.06.2011, 19:50     Почему нельзя объявить указатель на шаблонную структуру? #5
Цитата Сообщение от pito211 Посмотреть сообщение
на 4 байта на 32-х битной системе, на 8 на 64-х?
указатель изменяется на столько сколько занимает тип на который он указывает, а не сколько занимает сам указатель
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
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++ некорректная ведь операция...
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
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> в данном примере- это неважно, тут постигается логика компилятора)
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 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;
это пережиток прошлого. Не нужно так писать в С++.
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
28.08.2011, 20:07  [ТС]     Почему нельзя объявить указатель на шаблонную структуру? #9
Вы мне очень помогли. Снизойдите, напишите уж, как нужно писать...
fasked
Эксперт С++
4933 / 2513 / 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;
}
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
28.08.2011, 20:16     Почему нельзя объявить указатель на шаблонную структуру? #11
Цитата Сообщение от kravam Посмотреть сообщение
Вы мне очень помогли.
Там создаётся указатель на неизвестный тип. Этого делать нельзя, на что компилятор и намекает.
Если убрать шаблон, то тип становится известен и указатель создать можно, но такая запись характерна для Си, в С++ не стоит так писать. Это объединение абсолютно разных явлений: Объявление типа и объявление переменной. Не стоит это смешивать.
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
28.08.2011, 20:19     Почему нельзя объявить указатель на шаблонную структуру? #12
Цитата Сообщение от Deviaphan Посмотреть сообщение
Это объединение абсолютно разных явлений: Объявление типа и объявление переменной. Не стоит это смешивать.
Судя по typedef автор хотел объвить синоним типу указателя на шаблонный класс.
Цитата Сообщение от Deviaphan Посмотреть сообщение
но такая запись характерна для Си, в С++ не стоит так писать
На самом деле и в Си так делать не надо
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
28.08.2011, 20:24     Почему нельзя объявить указатель на шаблонную структуру? #13
Цитата Сообщение от fasked Посмотреть сообщение
Судя по typedef автор хотел объвить синоним типу указателя на шаблонный класс.
Только вот тип на тот момент не известен ещё... пичалька.)

Цитата Сообщение от fasked Посмотреть сообщение
и в Си так делать не надо
Старого Сишника только могила исправит.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.08.2011, 21:02     Почему нельзя объявить указатель на шаблонную структуру?
Еще ссылки по теме:
C++ Как объявить указатель на массив?
C++ Не знаю как объявить указатель!
Почему указатель на указатель объявляется как float **A; C++
C++ Как правильно объявить структуру
Объявить массив объектов класса Point - не работает указатель C++

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

Или воспользуйтесь поиском по форуму:
easybudda
Эксперт CЭксперт С++
9466 / 5479 / 927
Регистрация: 25.07.2009
Сообщений: 10,503
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 Посмотреть сообщение
На самом деле и в Си так делать не надо
Ну и с этим не поспоришь...
Yandex
Объявления
28.08.2011, 21:02     Почему нельзя объявить указатель на шаблонную структуру?
Ответ Создать тему
Опции темы

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