[C++] Parametr szablonu będący adresem jakiejś (konkretnej) komórki w pamięci.
Na wstępie zaznaczam, że nie chodzi mi o : parametr szablonu będący adresem
obiektu tylko adresem jakiejś (konkretnej) komórki pamięci. Utknąłem w
miejscu gdzie Grębosz (Pasja c++, I tom, wyd. trzecie poprawione, str. 157) pisze, że:
"Parametrem szablonu klas może być adres jakiejś komórki pamięci. Możemy sobie przecież wyobrazić szablon klas, które mają zająć się konkretnymi miejscami w pamięci. Adres takiego miejsca można uczynić parametrem szablonu.Taki adres może opisywać miejsce w pamięci, które jest buforem do pracy (np. z ekranem IBM PC) ... Oto przykład takiego szablonu:"
template < void * wsk > class oliver { public: }
|
Do utworzenia obiektu takiej klasy korzysta przy tym z niestandardowego
makra MK_FP zdefiniowanego w niestandardowym nagłówku:
<i86.h>, który korzysta również z nagłówka <_comdef.h>.
Mniejsza z tym,można je zdobyć w głębinach internetu. Tak czy siak intuicyjnie takie makro będzie "przerabiało" podane dane adresowe (segment, offset) na liczbę
unsigned int. I też tak robi.
Problem w tym, że kompilator nie dopuszcza do takiego utworzenia zmiennej:
oliver < Makro_Ktore_Zwraca_Unsigned_Int > var;
No i nie ma się czemu dziwić, parametrem szablonu ma być void * a jest unsigned int.
No dobra, zatem trzeba przerzutować tę wartość na void * ale takie coś:
oliver < reinterpret_cast < void *>( Makro_Ktore_Zwraca_Unsigned_Int ) > var;
wywala błąd:
error: a cast to a type other than an integral or enumeration type cannot
appear in a constant-expression
Zgadzam się oczywiście z kompilatorem :-)
Dalej autor pisze, że takie coś jest niepoprawne:
char znak;
void * wsk = & znak;
oliver < wsk > xx;
Co jest oczywiście ok.
Próba przekazania do szablonu jakiegokolwiek wskaźnika void * znanego w
trakcie kompilacji też nie działa:
error: 'wskazniczek' is not a valid template argument because
'wskazniczek' is a variable, not the address of a variable.
Próba przekazania do szablonu:
przy
int main()
{
...
oliver < wskaznik > var;
...
}
generuje błąd:
error: 'wskaznik' cannot appear in a constant-expression
Próba przekazania do szablonu znanego w trakcie kompilacji wskaznika void * ze słowami kluczowymi (const, volatile, extern) we wszystkich możliwych, poprawnych kombinacjach też nie przechodzi.
Jeśli próbuję zrobić coś takiego:
const unsigned int adres = 0x400000;
int main()
{
...
oliver <& adres > ekr;
...
}
to dostaję zachęcający błąd:
error: '& adres' is not a valid template argument of type 'void*' because 'adres' does not have external linkage
Dodaje więc extern:
extern const unsigned int adres = 0x400000;
int main()
{
...
oliver <& adres > ekr;
...
}
i niestety dostaję błąd:
error: could not convert template argument '& adres' to 'void*'
Czyli ciąg dalszy zabawy w berka :-(
Ktoś może pomyśleć, że stwarzam sztuczny problem. Otóż nie, piszę klasę do
obsługi plików PE Windowsa i "zdobycie" adresu w przestrzeni wirtualnej
procesu o odpowiednim atrybucie dostępu to pikuś. W celu przećwiczenia szablonów chciałem tego użyć. I tu jest problem. I nie chodzi mi już o to, że tego potrzebuje bo napisałem już bez użycia szablonów to co chciałem ale zaskoczenie i ciekawość pozostała.
Stąd moje pytanie czy:
Parametrem szablonu może być adres jakiejś (konkretnej) komórki w pamięci (jak poinformować o tym kompilator) czy też nie i jest to błąd w książce ???