Специализация (частичная или полная) не зависит от первичного определения в том смысле, что может быть определна совсем по другому и из первичного определения ничего не берет
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.
Здравствуйте, 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...
Здравствуйте, dad, Вы писали:
dad>понятно. я не зря употребил термин "замещение" (replacement) вместо специализация. dad>Дело в том, что у меня есть только справочный перевод стандарта с _немецкого_.
dad>И термин "замещение", на мой взгляд , более правильно характеризует dad>эту ситуацию. Тогда как термин "специализация" вводит в заблуждение.
dad>1) Что думаете по этому поводу?
Мне кажется, что термин "частичное замещение" не лучше термина "частичная специализация". ИМХО оба не отражают необходимость полного переопределения. Тут просто надо знать, что именно имеется ввиду. dad>2) где можно скачать стандарт на английском и есть ли качественные переводы (справочные) на русский (или не станлдарта а именно таких вот сложностей) ?
Английский вариант есть здесь
Значения по умолчанию для специализации указывать не нужно. Но возможно это не совсем, то что ты хочешь, так как второй параметр не специализаруется вообще, может быть нужно:
template<class B>
class C<X, BB<X> >
{
};
Все зависит от того что нужно специализировать. Кстати, что за компилятор, он поддрживает частичные специализации.
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> // ...и здесь инстанцирование должно производиться из общего шаблона
}
Здравствуйте Mihail Balabin, Вы писали:
MB>Компилятор — MS Visual C++ 6.
MSVC 6.0 не поддерживает частичную специализацию ( и вообще плоховато шаблоны поддерживает ).
Здравствуйте Ivan, Вы писали:
I>Здравствуйте Mihail Balabin, Вы писали:
MB>>Компилятор — MS Visual C++ 6. I>MSVC 6.0 не поддерживает частичную специализацию ( и вообще плоховато шаблоны поддерживает ).
А я-то думаю, что же у меня ничего не компилируется. А оказывается, что это всё Гейтс виноват.
Обидно, обидно...
Спасибо всем тем, кто потратил время, отвечая на мои вопросы.
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;
^
я думал при частичном замещении я имею право только переопределить то что хочу все остальное всиле..
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
L_L>>Твой исходный код с частичной специализацией, имеющей параметр по-умолчанию, не скомпилит даже хороший компилятор, потому что он неверен.
dad>относительно неверности кода второй вопрос и дополнение после исходного кода.
а! это ты не про мой...
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Здравствуйте, 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; ^
я думал при частичном замещении я имею право только переопределить то что хочу все остальное всиле..
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
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) где можно скачать стандарт на английском и есть ли качественные переводы (справочные) на русский (или не станлдарта а именно таких вот сложностей) ?
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
нет. Это вроде краткого справочника по стандарту 1995.
Посмотри на немецком Дерк Луис, Markt&Technik Buch und Software-Verlang, ISBN 5-89350-079-2 ISBN 3-8272-5066-8
тебе проще будет
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)