crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> перекрестные указатели в шаблонах
mezmay
  опции профиля:
сообщение 19.7.2011, 11:11
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


Есть 2 шаблона классов. Как сделать так чтобы они оба содержали указатели друг на друга и работали с этими указателями? В случае когда каждый шаблон полностью описан в заголовочном файла это сделать я так понял невозможно
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 19.7.2011, 19:56
Сообщение #2


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Как-то так, например:
class TA {};
class TB {};

template<class T_classB> class classB;

template<class T_classA> class classA
{
    classB<TB> *ptrB;
};

template<class T_classB> class classB
{
    classA<TA> *ptrA;
};


Но там была бага со старыми студиями. Вроде 6-я студия это не сожрёт. А новые компилеры вроде все поддерживают.

Можно разделить на два хедера:
class TA;
class TB {};

template<class T_classA> class classA;

template<class T_classB> class classB
{
    classA<TA> *ptrA;
};


class TB;
class TA {};

template<class T_classB> class classB;

template<class T_classA> class classA
{
    classB<TB> *ptrB;
};


P.S. шаблоны лучше вообще запихивать в cpp файлы. у мелкософта были косяки с шаблонами в заголовочниках. я сейчас смутно помню, в чём они заключались, но суть была такая, что лучше их запихивать в cpp. и ещё у них есть проблемы с шаблонами в dll. там надо создавать пустые представители класса, иначе линкер выкинет шаблон из библиотеки. впрочем, может, последние студии стали более продвинуты в этом плане, я не проверяла.

Сообщение отредактировал Iron Bug - 19.7.2011, 20:23
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 19.7.2011, 23:28
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Iron Bug @ 19.7.2011, 22:56) *
P.S. шаблоны лучше вообще запихивать в cpp файлы.
Или наоборт в h?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 20.7.2011, 6:56
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Iron Bug, не могу въехать что-то, распутай меня )))

ведь это указатель на класс типа "classB<TB>"
classB<TB> *ptrB;

а указатель могут передать на любой класс, например classB<X>*

получается, что у компилятора не будет информации, на какой именно класс указывает указатель. Как же он будет раскрывать разыменование?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 20.7.2011, 7:54
Сообщение #5


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Цитата(Алексей1153 @ 20.7.2011, 8:56) *
получается, что у компилятора не будет информации, на какой именно класс указывает указатель. Как же он будет раскрывать разыменование?

в общем случае, на уровне темплейтов такого контроля нет. когда собирается готовый проект, тогда компилятор по конкретному случаю уже смотрит, что и как. сам по себе темплейт такой встроенной проверки не содержит.

однако, есть техника SFINAE. можно указывать требуемые свойства класса. но не все компиляторы это поддерживают, насколько я знаю. про SFINAE много написано (например, тут можно посмотреть примеры: http://stackoverflow.com/questions/257288/...ions-existence).

ещё есть специализация темплейтов (ref) - когда для каждого параметра можно указать отдельное решение (например, можно почитать здесь: http://msdn.microsoft.com/en-us/magazine/cc163754.aspx).

кроме того, можно использовать страндартную проверку RTTI.

Сообщение отредактировал Iron Bug - 20.7.2011, 7:59
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 20.7.2011, 18:20
Сообщение #6


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


про эту штуку я давно в курсе (только не знал, как называется). Вопрос о другом. Ведь шаблонный класс компилятор рассматривает как полноправный класс, то есть classB<int> - это полноценный тип. А тут вот что:

class TA {};
class TB {};

template<class T_classB> class classB;

template<class T_classA> class classA
{
    public:
    classB<TB> *ptrB;
};

template<class T_classB> class classB
{
    public:
    classA<TA> *ptrA;
};

classA<int> a;
classB<char> b;

a.ptrB=&b;// указатель имеет тип classB<TB>* , а присваивается classB<char>*
b.ptrA=&a;// указатель имеет тип classA<TA>* , а присваивается classA<int>*


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

Цитата
error C2440: =: невозможно преобразовать 'classB<T_classB> *' в 'classB<T_classB> *'
error C2440: =: невозможно преобразовать 'classA<T_classA> *' в 'classA<T_classA> *'


хотя я ожидал другое ))) Навроде

error C2440: =: невозможно преобразовать 'classB<char> *' в 'classB<TB> *'
error C2440: =: невозможно преобразовать 'classA<int> *' в 'classA<TA> *'

всё, у меня крыша едет ))

Кстати, раз уж такая пьянка, давно меня интересует вопрос, почему нельзя было сделать в C/C++ проверку времени компиляции навроде:

#if(typeof(...) == int)
#else
#endif


по моему, это очень просто и иногда требуется. Почему такого не сделали ?



Сообщение отредактировал Алексей1153 - 20.7.2011, 18:21
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 20.7.2011, 19:38
Сообщение #7


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


:) это вопросы не ко мне, а к комитету по стандартизации. там про шаблоны всё написано и требований к контролю классов в них нет. да и быть не может. собственно, шаблон существует только до компиляции. это НЕ класс, не структура в памяти. это просто метод упрощения написания кода, с помощью абстрагирования.

ты пытаешься скрестить классы и базовые типы данных. это разные вещи, читай теорию. они совершенно по-разному хранятся в памяти, компилятор не умеет самостоятельно неявно преобразовывать базовые типы к классам. кроме того, базовые ещё делятся на скалярные и составные. и там тоже есть специфика.
если хочешь, чтобы аргументы разных типов принимались, как базовый класс шаблона, то либо пиши специализации для этих типов отдельно, либо добавляй конструкторы копии базового класса из этих типов. собственно, вряд ли от шаблонов требуется такая гибкость. упрощение - это упрощение. ради него не стоит лезть совсем уж в дебри.

Сообщение отредактировал Iron Bug - 20.7.2011, 19:57
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 20.7.2011, 19:43
Сообщение #8


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


но итог то един - приведённый тобой код в студии 2008 не компилится

Цитата
error C2440: =: невозможно преобразовать 'classB<T_classB> *' в 'classB<T_classB> *'
error C2440: =: невозможно преобразовать 'classA<T_classA> *' в 'classA<T_classA> *'


хотя это взрыв башки, если честно

Сообщение отредактировал Алексей1153 - 20.7.2011, 19:44
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 20.7.2011, 19:46
Сообщение #9


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Цитата(Алексей1153 @ 20.7.2011, 22:43) *
но итог то един - приведённый тобой код в студии 2008 не компилится

ну, что я могу сказать... я никогда не была сторонником мелкософта. они очень сильно отстают от стандартов и вообще у них в компиляторах давняя традиция глюков и несоответствий в области темплейтов. они об этом и сами писали. может, десятая студия получше в этом плане.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 25.4.2024, 18:59