Специализация шаблона
От: Mihail Balabin  
Дата: 05.11.02 15:47
Оценка:
Пусть есть некоторый шаблон:

template<class A,class B=BB<A> >
class C
{
//...
};

и некоторый класс:
class X
{
//...
};

Я пытаюсь создать частичную специализацию шаблона, но не могу разобратьс с синтаксисом.
Это должно быть что-то вроде:
template<X,class B=BB<X> >
class C<X,B>
{
//...
};

или, может быть, так:
template<class B=BB<X> >
class C<X,B>
{
//...
};

или что-то в этом роде. Как писать правильно?
Re: Специализация шаблона
От: Павел Кузнецов  
Дата: 05.11.02 15:52
Оценка: 6 (1)
Здравствуйте Mihail Balabin, Вы писали:

MB>Я пытаюсь создать частичную специализацию шаблона, но не могу разобратьс с синтаксисом. :(


template<class T>
class BB;

template<class A,class B=BB<A> >
class C
{
  //...
};

class X;

template<class B>
class C<X,B>
{
  //...
};
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re: Специализация шаблона
От: dupamid Россия  
Дата: 05.11.02 15:55
Оценка:
Здравствуйте Mihail Balabin, Вы писали:

MB>Пусть есть некоторый шаблон:


MB>
MB>template<class A,class B=BB<A> >
MB>class C
MB>{
MB>//...
MB>};
MB>

MB>и некоторый класс:
MB>
MB>class X
MB>{
MB>//...
MB>};
MB>

MB>Я пытаюсь создать частичную специализацию шаблона, но не могу разобратьс с синтаксисом.
MB>Это должно быть что-то вроде:
MB>
MB>template<X,class B=BB<X> >
MB>class C<X,B>
MB>{
MB>//...
MB>};
MB>

MB>или, может быть, так:
MB>
MB>template<class B=BB<X> >
MB>class C<X,B>
MB>{
MB>//...
MB>};
MB>

MB>или что-то в этом роде. Как писать правильно?

Если специализация для первого параметра, то так:
template<class B>
class C<X, B>
{
};

Значения по умолчанию для специализации указывать не нужно. Но возможно это не совсем, то что ты хочешь, так как второй параметр не специализаруется вообще, может быть нужно:
template<class B>
class C<X, BB<X> >
{
};

Все зависит от того что нужно специализировать. Кстати, что за компилятор, он поддрживает частичные специализации.
Re[2]: Специализация шаблона
От: Павел Кузнецов  
Дата: 05.11.02 15:58
Оценка:
Здравствуйте dupamid, Вы писали:

D>
D>template<class B>
D>class C<X, BB<X> >
D>{
D>};
D>


Здесь какая-то ошибка. Что ты хотел написать на самом деле?
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[3]: Специализация шаблона
От: dupamid Россия  
Дата: 05.11.02 16:03
Оценка:
Здравствуйте Павел Кузнецов, Вы писали:

Да-да облажался, нельзя вывести B, а сообщение удалить не успел

Это полная специализация, только нужно удалить "class B":
D>>
D>>template<>
D>>class C<X, BB<X> >
D>>{
D>>};
D>>


ПК>Здесь какая-то ошибка. Что ты хотел написать на самом деле?


Я имел в виду что-то типа такого.
template<template<class T> class B>
class C<X, B<X> >
{
};
Re[2]: Специализация шаблона/уточнение
От: Mihail Balabin  
Дата: 05.11.02 17:26
Оценка:
D>Все зависит от того что нужно специализировать. Кстати, что за компилятор, он поддрживает частичные специализации.

Специализировать надо первый аргумент шаблона. Второй аргумент должен либо определяться через первый(по умолчанию), либо указываться явно. Т.о.:

template<class T>
class BB
{
  //...
};

template<class A,class B=BB<A> >
class C
{
  //...
};

class X
{
  //...
};

//здесь специализация...

void main()
{
  C<X> c1;     // здесь...
  C<X,int> c2; // ...и здесь должна использоваться специализация

  С<char> c3;  // здесь...
  C<char,int>  // ...и здесь инстанцирование должно производиться из общего шаблона
}



Компилятор — MS Visual C++ 6.
Re[3]: Специализация шаблона/уточнение
От: Ivan Россия www.rsdn.ru
Дата: 05.11.02 17:38
Оценка:
Здравствуйте Mihail Balabin, Вы писали:

MB>Компилятор — MS Visual C++ 6.

MSVC 6.0 не поддерживает частичную специализацию ( и вообще плоховато шаблоны поддерживает ).
Re[4]: Re
От: Mihail Balabin  
Дата: 05.11.02 17:52
Оценка:
Здравствуйте Ivan, Вы писали:

I>Здравствуйте Mihail Balabin, Вы писали:


MB>>Компилятор — MS Visual C++ 6.

I>MSVC 6.0 не поддерживает частичную специализацию ( и вообще плоховато шаблоны поддерживает ).

А я-то думаю, что же у меня ничего не компилируется. А оказывается, что это всё Гейтс виноват.

Обидно, обидно...

Спасибо всем тем, кто потратил время, отвечая на мои вопросы.
Re: частичное замещение шаблонов
От: dad  
Дата: 14.01.04 14:05
Оценка:
1) почему на VC70 не компилируется ругается где см . метка:
2) разве при частичном замещении шаболона нужно _полностью_ переопределять класс (не компилируется приведеная конструкция см. метка comeau ) почему?

#include <utility>
#include <iostream>


template<class o, class t>
class s : public std::pair<o,t>
{
public:
    void met1()
    {
        std::cout<< first / second << std::endl;
    }

    void met2()
    {
        std::cout<< "no no"  << std::endl;
    }
};

template<class o>
class s<o,long>  //  ms70 error C2065: 'o' : undeclared identifier 
{
public:
    void met2()
    {
        met1();
    }
};

int main()
{
    s<float,float> ok;
    ok.first = 20;
    ok.second = 7;

    s<long> ok2;
    ok2.first = 20;
    ok2.second = 7;

    ok.met2();
    ok2.met2();
}

Copyright 1988-2003 Comeau Computing. All rights reserved.

line 13: error: identifier "first" is undefined
std::cout<< first / second << std::endl;
^

line 13: error: identifier "second" is undefined
std::cout<< first / second << std::endl;
^

line 28: error: identifier "met1" is undefined
met1();
^

line 38: error: too few arguments for class template "s"
s<long> ok2;
^


я думал при частичном замещении я имею право только переопределить то что хочу все остальное всиле..
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Re[5]: Re
От: Lorenzo_LAMAS  
Дата: 14.01.04 14:50
Оценка:
Твой исходный код с частичной специализацией, имеющей параметр по-умолчанию, не скомпилит даже хороший компилятор, потому что он неверен.
Of course, the code must be complete enough to compile and link.
Re[6]: Re
От: dad  
Дата: 14.01.04 14:55
Оценка:
L_L>Твой исходный код с частичной специализацией, имеющей параметр по-умолчанию, не скомпилит даже хороший компилятор, потому что он неверен.

относительно неверности кода второй вопрос и дополнение после исходного кода.
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Re[7]: Re
От: dad  
Дата: 14.01.04 14:56
Оценка:
L_L>>Твой исходный код с частичной специализацией, имеющей параметр по-умолчанию, не скомпилит даже хороший компилятор, потому что он неверен.

dad>относительно неверности кода второй вопрос и дополнение после исходного кода.


а! это ты не про мой...
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Re[2]: частичное замещение шаблонов - уточнение
От: dad  
Дата: 14.01.04 15:01
Оценка:
Здравствуйте, dad, Вы писали:

dad>1) почему на VC70 не компилируется ругается где см . метка:


это разобрался — не поддерживает частичное замещение

второй вопрос остается (явно лишние ошибки убрал в коде):

dad>2) разве при частичном замещении шаболона нужно _полностью_ переопределять класс (не компилируется приведеная конструкция см. метка comeau ) почему?


#include <utility>
#include <iostream>




template<class o, class t>
class s : public std::pair<o,t>
{
public:
    void met1()
    {
        std::cout<< this->first / this->second << std::endl;
    }

    void met2()
    {
        std::cout<< "no no"  << std::endl;
    }
};

template<class o>
class s<o,long>
{
public:
    void met2()
    {
        this->met1();
    }
};

int main()
{
    s<long, long> ok2; //s<long> ok2 ? ; 
    ok2.first = 20;
    ok2.second = 7;
    
    ok2.met2();
}

Copyright 1988-2003 Comeau Computing. All rights reserved.

"ComeauTest.c", line 28: error: class template "s<o, long>" has no member "met1"
this->met1();
^

"ComeauTest.c", line 35: error: class "s<long, long>" has no member "first"
ok2.first = 20;
^

"ComeauTest.c", line 36: error: class "s<long, long>" has no member "second"
ok2.second = 7; ^


я думал при частичном замещении я имею право только переопределить то что хочу все остальное всиле..
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Re[2]: частичное замещение шаблонов
От: Lorenzo_LAMAS  
Дата: 14.01.04 15:01
Оценка: 12 (1)
vc 7.0 не поддерживает частичных специализаций.

Специализация (частичная или полная) не зависит от первичного определения в том смысле, что может быть определна совсем по другому и из первичного определения ничего не берет

template<class, class>
struct A
{
    void fun(){}
};

template<class T>
struct A<T,int>
{
    void f(){}//Этот класс не имеет члена fun
};

void g()
{
   A<long, int>a;
   a.fun();//неверно
}
Of course, the code must be complete enough to compile and link.
Re[2]: частичное замещение шаблонов
От: Bell Россия  
Дата: 14.01.04 15:04
Оценка: 12 (1)
Здравствуйте, dad, Вы писали:

dad>1) почему на VC70 не компилируется ругается где см . метка:

Скорее всего баг. Судя по высказываниям на форуме, VC70 не очень далеко ушел от VC6 в плане поддержки шаблонов.

dad>2) разве при частичном замещении шаболона нужно _полностью_ переопределять класс


Да, именно так.

14.5.4.1
...
A partial specialization of a class template provides an alternative definition
of the template that is used instead of the primary definition when the arguments 
in a specialization match those given in the partial specialization...
Любите книгу — источник знаний (с) М.Горький
Re[3]: перевод specialization
От: dad  
Дата: 14.01.04 15:19
Оценка:
dad>>2) разве при частичном замещении шаболона нужно _полностью_ переопределять класс

B>Да, именно так.


B>
B>14.5.4.1
B>...
B>A partial specialization of a class template provides an alternative definition
B>of the template that is used instead of the primary definition when the arguments 
B>in a specialization match those given in the partial specialization...
B>


понятно. я не зря употребил термин "замещение" (replacement) вместо специализация.
Дело в том, что у меня есть только справочный перевод стандарта с _немецкого_.

И термин "замещение", на мой взгляд , более правильно характеризует
эту ситуацию. Тогда как термин "специализация" вводит в заблуждение.

1) Что думаете по этому поводу?
2) где можно скачать стандарт на английском и есть ли качественные переводы (справочные) на русский (или не станлдарта а именно таких вот сложностей) ?
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Re[4]: перевод specialization
От: Bell Россия  
Дата: 15.01.04 08:17
Оценка: 12 (1)
Здравствуйте, dad, Вы писали:

dad>понятно. я не зря употребил термин "замещение" (replacement) вместо специализация.

dad>Дело в том, что у меня есть только справочный перевод стандарта с _немецкого_.

dad>И термин "замещение", на мой взгляд , более правильно характеризует

dad>эту ситуацию. Тогда как термин "специализация" вводит в заблуждение.

dad>1) Что думаете по этому поводу?

Мне кажется, что термин "частичное замещение" не лучше термина "частичная специализация". ИМХО оба не отражают необходимость полного переопределения. Тут просто надо знать, что именно имеется ввиду.
dad>2) где можно скачать стандарт на английском и есть ли качественные переводы (справочные) на русский (или не станлдарта а именно таких вот сложностей) ?
Английский вариант есть здесь

ЗЫ
А у тебя случайно нет немецкого варианта?
Любите книгу — источник знаний (с) М.Горький
Re[5]: перевод specialization
От: dad  
Дата: 15.01.04 08:45
Оценка:
B>ЗЫ
B>А у тебя случайно нет немецкого варианта?

нет. Это вроде краткого справочника по стандарту 1995.
Посмотри на немецком Дерк Луис, Markt&Technik Buch und Software-Verlang,
ISBN 5-89350-079-2
ISBN 3-8272-5066-8

тебе проще будет
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.