compiler error C++
17 отговора
759 прегледа
compiler error C++
template<class U>
class FF {
public:
template<class T> void f();
};
template<class U, class T>
void FF<U>::f<T>() {
}
kakyv e pravilniq nachin da se definira tva, che neshto mi ubiagva.
class FF {
public:
template<class T> void f();
};
template<class U, class T>
void FF<U>::f<T>() {
}
kakyv e pravilniq nachin da se definira tva, che neshto mi ubiagva.
Re: compiler error C++
template<class U>
template <class T>
void FF<U>::f<T>() {
}
ако имаш късмет да ти го поддържа компилатора
Сигнатура!
template <class T>
void FF<U>::f<T>() {
}
ако имаш късмет да ти го поддържа компилатора
Сигнатура!
На 7-цата не става
Аз в момента преглеждам Александреску, щото си спомням, че нещо се оплакваше да не ставало тва.
You cannot specialize structure. Using templates alone, you cannot specialize the structure of a
class (its data members). You can specialize only functions.
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
You cannot specialize structure. Using templates alone, you cannot specialize the structure of a
class (its data members). You can specialize only functions.
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Re: compiler error C++
template<class T> void f();
Какво се опитваш да направиш с тва ? темплейтна фунцкия, която нито аргументите, нито връщаната стойност е от темплейтният тип .... на мен ми изглежда напълно no-sense
Какво се опитваш да направиш с тва ? темплейтна фунцкия, която нито аргументите, нито връщаната стойност е от темплейтният тип .... на мен ми изглежда напълно no-sense
Re: На 7-цата не става
Прегледай го по-подробно, ама преди това си измий очите, щото не виждам той да се опитва да специализира нещо 

Сигнатура!
Сигнатура!
Re: compiler error C++
ако имаш късмет да ти го поддържа компилатора
unfortunately - not.
unfortunately - not.
Re: На 7-цата не става
Аз в момента преглеждам Александреску, щото си спомням, че нещо се оплакваше да не ставало тва.
You cannot specialize structure. Using templates alone, you cannot specialize the structure of a
class (its data members). You can specialize only functions.
Това не е специализация а просто опит за дефиниция извън класа - когато е в класа става.
Re: compiler error C++
template<class T> void f();
Какво се опитваш да направиш с тва ? темплейтна фунцкия, която нито аргументите, нито връщаната стойност е от темплейтният тип .... на мен ми изглежда напълно no-sense
Ами например:
template<class IntegerFactory> int f() {
return IntegerFactory::produceTheHolyInteger();
}
Знаем от предишни дискусии че от ФАБРИКИТЕ по ВАЖНО просто НЕМА !!!!
Може да правиш и други неща.
Какво се опитваш да направиш с тва ? темплейтна фунцкия, която нито аргументите, нито връщаната стойност е от темплейтният тип .... на мен ми изглежда напълно no-sense
Ами например:
template<class IntegerFactory> int f() {
return IntegerFactory::produceTheHolyInteger();
}
Знаем от предишни дискусии че от ФАБРИКИТЕ по ВАЖНО просто НЕМА !!!!
Може да правиш и други неща.
Re: На 7-цата не става
Да, видях, още не съм изтрезнял. Нещо вчера от 4 водки направо се умъртвих. И сутринта даже имах главоболие. От години не съм имал такива тежки последствия от толкова малко алкохол.
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Re: compiler error C++
не е ли
template<class U>
template <class T>
void FF<U>::f() {
}
template<class U>
template <class T>
void FF<U>::f() {
}
Re: compiler error C++
Да, точно така е.
Някаква идея как се дефинира специализация на такава функция ?
Това не работи:
template <class U>
void FF<U>::f<int>() {
}
Някаква идея как се дефинира специализация на такава функция ?
Това не работи:
template <class U>
void FF<U>::f<int>() {
}
цъ-то
не е за всеки. Явно не е за теб, ма на човека може да му понася. Всичко дето не е за теб и се пробваш да го правиш може да те вкара в психиатрия.
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Re: compiler error C++
Мда вярно че е така.
Уф зарових се в лай..та по нощите :)
Ако функцията ти има параметър:
template <class X>
class Boza
{
template <class Y>
void f(Y) {}
// няма специализация на функции-templ., просто си правиш
// overload
void f(int) {}
};
template <> template <class R> FF<double>::f(R) {}
template <> template <> FF<double>::f(int) {}
Ако няма параметър, нещо не мога да го докарам, то май и няма особено смисъл, щото кво ша параметризираш освен ретурн типа.
Уф зарових се в лай..та по нощите :)
Ако функцията ти има параметър:
template <class X>
class Boza
{
template <class Y>
void f(Y) {}
// няма специализация на функции-templ., просто си правиш
// overload
void f(int) {}
};
template <> template <class R> FF<double>::f(R) {}
template <> template <> FF<double>::f(int) {}
Ако няма параметър, нещо не мога да го докарам, то май и няма особено смисъл, щото кво ша параметризираш освен ретурн типа.
Редактирано от Questor на
Re: compiler error C++
Мисля, че трябва да специализираш и класа и функциата едновременно
template<>
template<>
void FF<char>::f<int>() {
}
но, не и
template<class U>
template<>
void FF<U>::f<int>() {
}
template<>
template<>
void FF<char>::f<int>() {
}
но, не и
template<class U>
template<>
void FF<U>::f<int>() {
}
Re: compiler error C++
Някакво решение на проблема за пълната специализация на функциите в такъв клас може да изглежда така:
template<class T>
class Type2Type {
typedef T Type;
};
template<class T>
class FF {
public:
template<class U> void f(Type2Type<U>);
void f(Type2Type<int>);
};
template<class T>
template<class U>
void FF<T>::f(Type2Type<U>) {
printf("general purpose\n");
}
template<class T>
void FF<T>::f(Type2Type<int>) {
printf("specialized version\n");
}
Това всъщност си е същата идея като от книгата на Александреску, но той там май го ползваше за частична специализация на темплейтни функции - то това което съм го написал реално пак си е workaround за частична специализация де.
template<class T>
class Type2Type {
typedef T Type;
};
template<class T>
class FF {
public:
template<class U> void f(Type2Type<U>);
void f(Type2Type<int>);
};
template<class T>
template<class U>
void FF<T>::f(Type2Type<U>) {
printf("general purpose\n");
}
template<class T>
void FF<T>::f(Type2Type<int>) {
printf("specialized version\n");
}
Това всъщност си е същата идея като от книгата на Александреску, но той там май го ползваше за частична специализация на темплейтни функции - то това което съм го написал реално пак си е workaround за частична специализация де.
Re: compiler error C++
Нещо ми се губи идеята от ползата на такова сложно решение на проблема...
Защо са необходими всички тези игри с темплейти след като ти е необходима следната декларация в класа:
void f(Type2Type<int>);
Не е ли далеч по-прегледно:
template <class T> class FF
{
void f(void); // general
void f(int); // special
};
template <class T> void FF<T>::f(void) {}
template <class T> void FF<T>::f( int ) {}
Защо са необходими всички тези игри с темплейти след като ти е необходима следната декларация в класа:
void f(Type2Type<int>);
Не е ли далеч по-прегледно:
template <class T> class FF
{
void f(void); // general
void f(int); // special
};
template <class T> void FF<T>::f(void) {}
template <class T> void FF<T>::f( int ) {}
Re: compiler error C++
Нещо ми се губи идеята от ползата на такова сложно решение на проблема...
Ами да ... в някои случаи ще е прекалено сложно, но нали трябва да има много темплейти, много звездички и по възможност фабрики и сингълтони ... а да, и алгоритми. Just kidding - просто ми е интересно какво може и не може да се прави.
А иначе - Type2Type може да ти е нужен понякога.
Например за тези функции в нашия клас FF - твоя вариант има недостатък,
стойността която се използва за този overload се предава по стойност, налага се да се създава отвън обект от въпросния тип - това може да е overhead ако обекта е голям. Ще кажеш - окей, ще ги направим на указатели към въпросния обект - това пак си има недостатък, налага ти се някакви указатели отвън да ти се мотат. Например:
FF<int> f;
MyType *t(NULL);
f(t);
Грозотия си е. Толкова за Type2Type.
Сега за останалото - защо можеш да искаш функцията ти да изглежда така за генерал случая:
template<class U> void f(Type2Type<U>);
вместо да изглежда така:
void f(void);
Ами много просто - вътре можеш да искаш да правиш някакви манипулации със този тип U - да създаваш обекти, да викаш статични методи(ако е клас) - whatever - във твоя вариант това няма да може да стане.
Ами да ... в някои случаи ще е прекалено сложно, но нали трябва да има много темплейти, много звездички и по възможност фабрики и сингълтони ... а да, и алгоритми. Just kidding - просто ми е интересно какво може и не може да се прави.
А иначе - Type2Type може да ти е нужен понякога.
Например за тези функции в нашия клас FF - твоя вариант има недостатък,
стойността която се използва за този overload се предава по стойност, налага се да се създава отвън обект от въпросния тип - това може да е overhead ако обекта е голям. Ще кажеш - окей, ще ги направим на указатели към въпросния обект - това пак си има недостатък, налага ти се някакви указатели отвън да ти се мотат. Например:
FF<int> f;
MyType *t(NULL);
f(t);
Грозотия си е. Толкова за Type2Type.
Сега за останалото - защо можеш да искаш функцията ти да изглежда така за генерал случая:
template<class U> void f(Type2Type<U>);
вместо да изглежда така:
void f(void);
Ами много просто - вътре можеш да искаш да правиш някакви манипулации със този тип U - да създаваш обекти, да викаш статични методи(ако е клас) - whatever - във твоя вариант това няма да може да стане.