compiler error C++

17 отговора 759 прегледа
#1

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.

Отговор
в отговор на z-order #2

Re: compiler error C++

template<class U>
template <class T>
void FF<U>::f<T>() {
}

ако имаш късмет да ти го поддържа компилатора

Сигнатура!
Отговор
в отговор на Questor #3

На 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?_
Отговор
в отговор на z-order #4

Re: compiler error C++

template<class T> void f();

Какво се опитваш да направиш с тва ? темплейтна фунцкия, която нито аргументите, нито връщаната стойност е от темплейтният тип .... на мен ми изглежда напълно no-sense

Отговор
в отговор на Colombino #5

Re: На 7-цата не става

Прегледай го по-подробно, ама преди това си измий очите, щото не виждам той да се опитва да специализира нещо

Сигнатура!
Отговор
в отговор на Questor #6

Re: compiler error C++

ако имаш късмет да ти го поддържа компилатора

unfortunately - not.

Отговор
в отговор на Colombino #7

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.



Това не е специализация а просто опит за дефиниция извън класа - когато е в класа става.

Отговор
в отговор на yasuhiro #8

Re: compiler error C++

template<class T> void f();

Какво се опитваш да направиш с тва ? темплейтна фунцкия, която нито аргументите, нито връщаната стойност е от темплейтният тип .... на мен ми изглежда напълно no-sense


Ами например:

template<class IntegerFactory> int f() {
return IntegerFactory::produceTheHolyInteger();
}

Знаем от предишни дискусии че от ФАБРИКИТЕ по ВАЖНО просто НЕМА !!!!

Може да правиш и други неща.

Отговор
в отговор на z-order #9

Re: На 7-цата не става

Да, видях, още не съм изтрезнял. Нещо вчера от 4 водки направо се умъртвих. И сутринта даже имах главоболие. От години не съм имал такива тежки последствия от толкова малко алкохол.

System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Отговор
в отговор на z-order #10

като си говорим за темплейти ....

има и филм по темата:
[линк]

Отговор
в отговор на Questor #11

Re: compiler error C++

не е ли

template<class U>
template <class T>
void FF<U>::f() {
}

Отговор
в отговор на stef #12

Re: compiler error C++

Да, точно така е.

Някаква идея как се дефинира специализация на такава функция ?

Това не работи:

template <class U>
void FF<U>::f<int>() {
}

Отговор
#13

цъ-то

не е за всеки. Явно не е за теб, ма на човека може да му понася. Всичко дето не е за теб и се пробваш да го правиш може да те вкара в психиатрия.

System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Отговор
в отговор на z-order #14

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) {}


Ако няма параметър, нещо не мога да го докарам, то май и няма особено смисъл, щото кво ша параметризираш освен ретурн типа.

Редактирано от Questor на

Отговор
в отговор на z-order #15

Re: compiler error C++

Мисля, че трябва да специализираш и класа и функциата едновременно

template<>
template<>
void FF<char>::f<int>() {
}

но, не и

template<class U>
template<>
void FF<U>::f<int>() {
}

Отговор
в отговор на Questor #16

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 за частична специализация де.

Отговор
в отговор на z-order #17

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 ) {}


Отговор
в отговор на asf #18

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 - във твоя вариант това няма да може да стане.

Отговор