(spezialisiertes) Template

Post Reply
Message
Author
sureal

(spezialisiertes) Template

#1 Post by sureal »

Hallo!
Meine Frage bezieht sich auf Funktionstemplates. Ich bin gerade am lernen wie man Templates einsetzt. Zu einem habe ich ein Buch und ein Tutorial mit folgender Adresse.
http://www.cpp-tutor.de/cpp/le15/le15_01.htm Die Aussagen sind hier die selben aber ich bekomme von meinem Compiler immer den selben Fehler bezüglich spezialisierter Templates.

Code: Select all

template <typename T>
 T Max&#40;T p1, T p2&#41;
 &#123;
     return &#40;&#40;p1>p2&#41;? p1 &#58; p2&#41;;
/*Das ist klar und funktioniert auch*/ 
&#125;

Code: Select all

/*ein anderer Code mit spezialisiertem Template*/
template<> 
char* Max<char*>&#40;char* p1, char* p2&#41;
 &#123;
     if &#40;strcmp&#40;p1,p2&#41; > 0&#41;
         return p1;
     else
         return p2;
/*Hier bekomme ich eine Fehlermeldung die lautet&#58; ... used a non template as a template .....
also soviel wie -das ich ein nicht Template als Template benutzen will*/
 &#125;
Im Buch ist es so beschrieben und wie man sieht in dem Tutorial auch, doch warum geht das nicht?
Ich verstehe es nicht, ich suche in mehreren Quellen aber ich verstehe nicht warum es nicht geht.

Danke für jede Hilfe.
MfG

PS: Kdevelop 3.1.2 (Linux) GCC 3.3.4
DevCpp aktuell mit MinGW (Windows) GCC 3.2.3

tj

#2 Post by tj »

Hi,

ich kann dir leider auch nicht direkt helfen,
aber auf jeden Fall laesst sich dein Code mit
dem (good) old GCC2.9 kompilieren.

Hab gerade auch noch mal bei Stroustrup\
geguckt: Dein Code sollte so funktionieren.
Vieleicht ein GCC3.3-Problem?

tj

User avatar
heinrich
Posts: 219
Joined: 22. Sep 1999 11:22
Location: N49.137 E8.544

#3 Post by heinrich »

Das Max<char*> ist aber nur eine Spezialisierung von template<typename T> T Max(...). Ohne dieses Template kannst du keine Spezialisierung Max<char*> vornehmen und bekommst dann zu Recht die Fehlermeldung error: `Max' is not a function template -- schliesslich existiert ja auch kein Funktionstemplate für Max().
Daher musst du bevor du Max<char*> deklarierst auch noch das passende (allgemeine) Funktionstemplate für Max() anlegen.

Das nachfolgende Beispiel ist korrekt und funktioniert fehlerfrei.

Code: Select all

#include<stdio.h>
#include<string.h>

template<typename T>
T Max&#40;T p1, T p2&#41;
&#123;
  return &#40;&#40;p1>p2&#41; ? p1 &#58; p2&#41;;
&#125;

template<> 
char* Max<char*>&#40;char* p1, char* p2&#41;
&#123;
  if&#40;strcmp&#40;p1,p2&#41;>0&#41; return p1;
  else                return p2;
&#125;

int main&#40;&#41;
&#123;
  char* c1 = "a";
  char* c2 = "b";
  int  i1 = 5;
  int  i2 = 8;

  printf&#40;"%i -vs- %i => %i\n", i1, i2, Max&#40;i1, i2&#41; &#41;;
  printf&#40;"%s -vs- %s => %s\n", c1, c2, Max&#40;c1, c2&#41; &#41;;
  return 0;
&#125;
It just works.

sureal

#4 Post by sureal »

Ja, das war das Problem das ich auch schon im C++ Forum diskutiert habe.
Ich habe das nicht gewusst mit allgemeinem + spez. Template.
Jetzt wo ich es weiß macht es irgendwie Sinn.
Aber danke für die Antworten.
Ich habe an sich ein gutes Buch aber es wird einiges voraus gesetzt scheint mir so. Kann auch sein das ich nicht aufmerksam genug gelesen habe.

So long

Post Reply