30.06.2013 Aufrufe

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

416 13. Templates<br />

In Zeile 48 wird f<strong>in</strong>dMax mit e<strong>in</strong>em <strong>in</strong>t32 Array und e<strong>in</strong>em <strong>in</strong>t Längenparameter<br />

aufgerufen, was natürlich den Compiler dazu bewegt, e<strong>in</strong>e konkrete<br />

Ausprägung aus dem Template zu generieren. Anders verhält es sich da<br />

schon mit Zeile 49, <strong>in</strong> der f<strong>in</strong>dMax mit e<strong>in</strong>em double Array und e<strong>in</strong>em u<strong>in</strong>t32<br />

Längenparameter aufgerufen wird. Da unsere konkrete Implementierung von<br />

f<strong>in</strong>dMax haarscharf diesen Parametersatz deklariert, sieht der Compiler überhaupt<br />

ke<strong>in</strong>e Veranlassung, aus dem Template e<strong>in</strong>e konkrete Ausprägung zu<br />

basteln, denn es gibt ja bereits e<strong>in</strong>e Implementation der Funktion, die alle<br />

Wünsche erfüllt. Der Beweis dieser Aussage f<strong>in</strong>det sich im Output des<br />

Programms:<br />

template implementation o f f<strong>in</strong>dMax<br />

concrete implementation of f<strong>in</strong>dMax<br />

Das Angenehme an dieser Tatsache ist, dass wir also offensichtlich e<strong>in</strong>en<br />

gewissen E<strong>in</strong>fluss auf bestimmte Ausprägungen e<strong>in</strong>es Templates nehmen<br />

können. Wenn z.B. e<strong>in</strong>e besondere Ausprägung e<strong>in</strong>es Templates mit e<strong>in</strong>em<br />

ganz bestimmten Datentyp, aus welchem Grund auch immer, e<strong>in</strong>e besondere<br />

Implementation benötigt, dann können wir diese explizit schreiben. Hiermit<br />

kann man z.B. sehr gut die Behandlung von Sonderfällen <strong>in</strong>nerhalb von<br />

Templates <strong>in</strong> Grenzen halten.<br />

Wo es e<strong>in</strong>e angenehme Seite gibt, ist leider oft die unangenehme Seite<br />

auch nicht weit. Natürlich gibt es bei dieser Vorgehensweise auch nette Stolperste<strong>in</strong>e:<br />

Vorsicht Falle: Sollte der Parametersatz beim Aufruf nicht vollkommen<br />

exakt auf die konkrete Implementation der Funktion passen, dann kann man<br />

den Compiler <strong>in</strong> e<strong>in</strong> Ambiguitätsproblem stürzen, das er nicht mehr automatisch<br />

auflösen kann. Nehmen wir nur e<strong>in</strong>mal an, dass <strong>in</strong> Zeile 49 der Aufruf<br />

folgendermaßen lauten würde:<br />

f<strong>in</strong>dMax(test_array2,5)<br />

dann bedeutet dies für den Compiler e<strong>in</strong>en Aufruf mit e<strong>in</strong>em double Array<br />

und mit e<strong>in</strong>em <strong>in</strong>t Parameter. Das passt nicht vollkommen exakt auf die<br />

konkrete Implementation, ist aber auch noch nicht so weit daneben, dass<br />

nicht mit e<strong>in</strong>er impliziten Typumwandlung noch etwas zu machen wäre.<br />

Je nach Compiler passiert es hierbei, dass er entweder e<strong>in</strong>e Warn<strong>in</strong>g von<br />

sich gibt, oder sich sogar vollständig weigern kann, die Entscheidung für e<strong>in</strong>e<br />

der beiden Varianten selbsttätig zu treffen. Es kann dann nur noch mit e<strong>in</strong>em<br />

expliziten Cast Abhilfe geschaffen werden. Wenn man allerd<strong>in</strong>gs mit e<strong>in</strong>er<br />

fremden Library arbeitet, kann das schon e<strong>in</strong>iges an Rätselraten zur Folge<br />

haben, bis man endlich durchschaut hat, warum sich der Compiler an e<strong>in</strong>er<br />

bestimmten Stelle schlicht und ergreifend weigert, se<strong>in</strong>e Arbeit zu erledigen.<br />

Bisher s<strong>in</strong>d wir immer davon ausgegangen, dass der Compiler durch Analyse<br />

der Aufrufparameter implizit e<strong>in</strong>e passende konkrete Ausprägung e<strong>in</strong>er<br />

Funktion erzeugt. Manchmal s<strong>in</strong>d wir allerd<strong>in</strong>gs <strong>in</strong>teressiert daran, dies selbst<br />

<strong>in</strong> die Hand zu nehmen. Betrachten wir nur e<strong>in</strong>fach den Fall, dass wir <strong>in</strong> ei-

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!