Не пойму, что имеет ввиду Александреску, цитата:
Шаблонная функция-член не может иметь несколько аргументов, заданых по умолчанию
template<class T = int, class U = double>
class A
{
void foo();
};
template<class T, class U>
void A<T, U>::foo()
{
}
может это?
template<class T>
class B
{
void foo(int val = 100);
};
template<class T>
void B<T>::foo(int val /* = 100*/)
{
}
или это?
template<typename T = int, typename U = double>
class C
{
void foo();
}
template<typename T = int, typename U = double> //error compile (default template arguments may not be used in function templates)
void C<T, U>::foo()
{
}
поясните плиз
Здравствуйте, Logot, Вы писали:
L>Не пойму, что имеет ввиду Александреску, цитата:
L>L>Шаблонная функция-член не может иметь несколько аргументов, заданых по умолчанию
L>L>template<class T = int, class U = double>
L>class A
L>{
L> void foo();
L>};
L>template<class T, class U>
L>void A<T, U>::foo()
L>{
L>}
L>
L>может это?
Нет, здесь речь идет о шаблоне класса.
L>L>template<class T>
L>class B
L>{
L> void foo(int val = 100);
L>};
L>template<class T>
L>void B<T>::foo(int val /* = 100*/)
L>{
L>}
L>
L>или это?
Нет, здесь речь о шаблоне класса и
параметре по умолчанию.
L>L>template<typename T = int, typename U = double>
L>class C
L>{
L> void foo();
L>}
L>template<typename T = int, typename U = double> //error compile (default template arguments may not be used in function templates)
L>void C<T, U>::foo()
L>{
L>}
L>
Это просто первый пример с неправильнным синтаксисом.
L>поясните плиз
Скорее всего речь об этом:
//------------------------------------------------
//Ok
template<class T = int, class U = int>
class test1 {};
//------------------------------------------------
//Ok
template<class T = int, class U = int>
class test2
{
void mf2(T t, U u);
};
template<class T, class U>
void test2<T, U>::mf2(T t, U u) {}
//------------------------------------------------
//Так нельзя - шаблон функции не может иметь аргументы по умолчанию
template<class T = int, class U = int>
void f1(T t, U u) {}
//------------------------------------------------
//Так нельзя - шаблон функции-члена не может иметь аргументы по умолчанию
class test3
{
template<class T = int, class U = int>
void mf3(T t, U u);
};
template<class T, class U>
void test3::mf3(T t, U u) {}
Здравствуйте, Bell, Вы писали:
<skip/>
Для функции как раз шаблонные аргументы по умолчанию не нужны.
Можно просто перегрузить:
template<typename T>
void f(T);
template<typename U, typename V>
void f(U, V);
А вот классы, к сожалению, нельзя.
Вот там как раз и нужны значения по умолчанию из-за отсутствия "перегрузок" класса.
Здравствуйте, Bell, Вы писали:
B>Скорее всего речь об этом:
B>//------------------------------------------------
B>//Ok
B>template<class T = int, class U = int>
B>class test1 {};
B>//------------------------------------------------
B>//Ok
B>template<class T = int, class U = int>
B>class test2
B>{
B> void mf2(T t, U u);
B>};
B>template<class T, class U>
B>void test2<T, U>::mf2(T t, U u) {}
B>//------------------------------------------------
B>//Так нельзя - шаблон функции не может иметь аргументы по умолчанию
B>template<class T = int, class U = int>
B>void f1(T t, U u) {}
B>
Он говорил, о методе класса, а не о глобальной шаблонной функции
B>//------------------------------------------------
B>//Так нельзя - шаблон функции-члена не может иметь аргументы по умолчанию
B>class test3
B>{
B> template<class T = int, class U = int>
B> void mf3(T t, U u);
B>};
B>template<class T, class U>
B>void test3::mf3(T t, U u) {}
B>
Так шаблонная функция-член не может иметь даже и один аргумент по умолчанию. Привожу цитату полностью:
В лучшем случае программист, реализующий шаблонный класс, может задать для каждой функции-члена одну реализацию по умолчанию. Шаблонная функция-член не может иметь несколько аргументов, заданых по умолчанию.
Или это так класно перевели?