Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поддержка частичной специализации шаблонов, отсутствует? 
:(
    Опции темы
vaddsm
  Дата 26.5.2009, 02:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 30.6.2007

Репутация: нет
Всего: нет



Подскажите, пожалуйста есть ли возможность сделать на BCB 6.0 подобный код компилируемым:

Код


template <typename R> class callback_cast
{

};

template <class R, class T0 , class T1 , class T2 , class T3>
class callback_cast<R (__stdcall *)( T0 , T1 , T2 , T3)>
{

};



Или данный компилятор не поддерживает стандарт языка в полной мере?
PM MAIL   Вверх
Lazin
Дата 26.5.2009, 08:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 18
Всего: 154



частичная специализация шаблонов применяется в STL, следовательно BCB6 это умеет
PM MAIL Skype GTalk   Вверх
vaddsm
Дата 26.5.2009, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 30.6.2007

Репутация: нет
Всего: нет



Спасибо, что присоединился к данному треду, думал тебя  выуживать из общего раздела по c++ .) Касательно проблемы. Совершенно очевидно что -- нет. Предположительно она должна поддерживаться, но видимо не в полной мере. Компилятор не верно парсирует функциональные типы. Приведенный мною код валиден в VC9.0 , Comeau и Mingw но не в Borland (.
PM MAIL   Вверх
Lazin
Дата 26.5.2009, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 18
Всего: 154



ну, то что bcb6 не поддерживает стандарт в полной мере - известный факт
какой workaround здесь поможет я не знаю
PM MAIL Skype GTalk   Вверх
vaddsm
Дата 26.5.2009, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 30.6.2007

Репутация: нет
Всего: нет



Еще хочу дополнить пример вот таким фейлом: 

Код

 template <class C, class R, class T0 , class T1 , class T2 , class T3, 
 R (__stdcall C::*M)( T0 , T1 , T2 , T3)>
 class some
 {


 };


+ VC9.0
+ Comeau
- Mingw 
- Borland

Добавлено через 7 минут и 21 секунду
Прошу, взглянуть опытным взглядом и поставить вердикт относительно валидности приведенного кода. Буду очень рад совместимым с другими компиляторами предложениям по изменению кода. 
PM MAIL   Вверх
mrbrooks
Дата 26.5.2009, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



 smile 
меня всегда умилял тот факт, что сравнивают CB6 и VC9.
PM MAIL   Вверх
vaddsm
Дата 26.5.2009, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 30.6.2007

Репутация: нет
Всего: нет



))) Никто ничего не сравнивает, мне нужно добиться совместимости кода и только. Прошу не разжигать расовой ненависти в этом топике.
PM MAIL   Вверх
azesmcar
Дата 26.5.2009, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 6
Всего: 211



vaddsm

С точки зрения С++ - нормальный код, с моей точки зрения - выглядет хреново, но это не мешает ему быть правильным.


Цитата(vaddsm @  26.5.2009,  09:01 Найти цитируемый пост)

+ VC9.0
+ Comeau
- Mingw 
- Borland

MinGW это откомпилирует по самые помидоры, наверное он на __stdcall ругается.
насчет борланда - не знаю, а в чем конкретно проблема и где выдается ошибка?

Добавлено через 3 минуты и 18 секунд
Код

 template <class C, class R, class T0 , class T1 , class T2 , class T3, 
 R (__stdcall C::*M)( T0 , T1 , T2 , T3)>
 class some
 {
 };

речь конкретно об этом куске кода

Добавлено через 7 минут и 7 секунд
Проверьте этот код.
Код

class C
{
public:
    void foo(T1 p1, T2 p2)
    {
        std::cout << "template " << p1 << " " << p2 << std::endl;
    }
};

template <class T1>
class C<T1, int>
{
public:
    void foo(T1 p1, int p2)
    {
        std::cout << "template specialization " << p1 << " " << p2 << std::endl;
    }
};

int main()
{
    C<int, std::string> t1;
    t1.foo(1, "hello");
    C<std::string, int> t2;
    t2.foo("hello", 1);
}


Это сообщение отредактировал(а) azesmcar - 26.5.2009, 09:51
PM   Вверх
vaddsm
Дата 26.5.2009, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 30.6.2007

Репутация: нет
Всего: нет



2 azesmcar. 

Ваш пример с небольшой коррекцией 

Код

[U]template<class T1, class T2>[/U]
class C
{
public:
    void foo(T1 p1, T2 p2)
    {
        std::cout << "template " << p1 << " " << p2 << std::endl;
    }
};


Естественно компилируется всюду. 

Однако, весьма странно, мой шаблон класса some действительно не компилировался в MinGW по причине указания в шаблоне соглашения __stdcall. Сразу вопрос: почему? И как мне указать соглашение о вызове в шаблоне, для данного компилятора?

Добавлено через 6 минут и 58 секунд
 smile В борланде по той же причине! Убираю соглашение, все проходит на ура. Но конкретизация специализации по соглашению мне в крайней степени нужна. Ваши предложения?
PM MAIL   Вверх
azesmcar
Дата 26.5.2009, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 6
Всего: 211



Вообще почему бы не писать так?
Код

 template <class C, class R, class Func>
 class some
 {
 };


PM   Вверх
vaddsm
Дата 26.5.2009, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 30.6.2007

Репутация: нет
Всего: нет



Потому как нужен не тип, а адрес метода. Вот, что интересно, в борланде радостно компилируется такой вариант:

Код

template <class R, class T0 , class T1 , class T2 , class T3>
class callback_cast<R __stdcall (*)( T0 , T1 , T2 , T3)>{};


А на MinGW, это Segmentation fault.

Добавлено через 8 минут и 51 секунду
Подитожу:

Код

template <class R, class T0 , class T1 , class T2 , class T3>
class callback_cast<R __stdcall (*)( T0 , T1 , T2 , T3)>
Borland      +
VC9.0         syntax error
MinGW        Segmentation fault

PM MAIL   Вверх
azesmcar
Дата 26.5.2009, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 6
Всего: 211



Цитата(vaddsm @  26.5.2009,  20:17 Найти цитируемый пост)
template <class R, class T0 , class T1 , class T2 , class T3>
class callback_cast<R __stdcall (*)( T0 , T1 , T2 , T3)>{};

можно весь код посмотреть? непохоже на частичную специализацию.
PM   Вверх
vaddsm
Дата 26.5.2009, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 30.6.2007

Репутация: нет
Всего: нет



Для борланда думаю сделать так:

Код

#ifndef __BORLANDC__
#define CALLBACK_SPEC1 __stdcall
#define CALLBACK_SPEC2 
#else
#define CALLBACK_SPEC1 
#define CALLBACK_SPEC2 __stdcall
#endif

template <class R, class T0 , class T1 , class T2 , class T3>
class externalclass<R CALLBACK_SPEC2(CALLBACK_SPEC1 *)( T0 , T1 , T2 , T3)>{};


Да это не частичная специализация, прошу прощение за то что смутил, вот полный вариант с нистид классом где присутствует частичная специализация:

Код

template <typename R> class externalclass {};

template <class R, class T0 , class T1 , class T2 , class T3>
class externalclass<R CALLBACK_SPEC2(CALLBACK_SPEC1 *)( T0 , T1 , T2 , T3)>
{
public:
 typedef R  (__stdcall *call_back_type)( T0 , T1 , T2 , T3);
 template <class C, R (__stdcall C::*M)( T0 , T1 , T2 , T3)> class nested 
 {

 };
};
 

Borland      +
MinGW        -


Код

 //...

 template <class C, R (C::*M)( T0 , T1 , T2 , T3)> class nested {};

 //...

MinGW        +

При этом частичная специализация nested проходит в MinGW для всех типов соглашений (не только __cdecl), что весьма странно. 



Это сообщение отредактировал(а) vaddsm - 26.5.2009, 21:54
PM MAIL   Вверх
azesmcar
Дата 26.5.2009, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 6
Всего: 211



vaddsm

Код

template <class C, class R, class Func>
class some
{
};

и все таки я бы сделал так.

Цитата(vaddsm @  26.5.2009,  21:46 Найти цитируемый пост)
Для борланда думаю сделать так:

а какой смысл в этих препроцессорах?

На MinGW завтра на работе гляну, дома нет.
PM   Вверх
vaddsm
Дата 26.5.2009, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 30.6.2007

Репутация: нет
Всего: нет



В препроцессорах опечаточка была, подправил. 

Код

template <class C, class R, class Func>
class some
{
 // Тут  Func это ТИП.
}; 

template <class C, R (__stdcall C::*M)( T0 , T1 , T2 , T3)> class nested 
{
 // Здесь M это адрес - число.
};

PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0602 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.