Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » Xcode Fehler

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
30.03.2011, 18:14 Uhr
citoo



Hallo an alle,
ich versuch mich zum ersten Mal an Templates, aber Xcode spuckt mir bei foldenden Programm stets einen Fehler aus...

C++:
#include <iostream>
using namespace std;

template < typename T >
T max(T x, T y)
{
    if (x < y)
        return y;
    else
        return x;
}


int main (int argc, const char * argv[])
{
    cout << max(3, 7);
}



In der eigentlichen main-Funktion wird bei der cout-Zeile die Fehlermeldung "call to max is ambiguous" angezeigt. Kann mir da jmd weiterhelfen?

Vielen Dank im Vorraus!


Bearbeitung von 0xdeadbeef:

cpp-Tags eingefügt. Nächstes mal bitte selbst machen.


Dieser Post wurde am 30.03.2011 um 18:28 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
30.03.2011, 18:27 Uhr
0xdeadbeef
Gott
(Operator)


Das ist wenig verwunderlich, wenn du den gesamten Namensraum std ins globale Scope ziehst und dann Symbole daraus redefinierst. Lass

C++:
using namespace std;


weg und schreib

C++:
std::cout << max(3, 7);



Alternativ sollte auch

C++:
::max(3, 7)


funktionieren.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
30.03.2011, 18:59 Uhr
citoo



Vielen Dank für die schnelle Antwort, jetzt funktioniert das Programm einwandfrei!

Gibt es noch eine andere (globale) Methode, den Fehler zu beheben, als ein std:: voranzustellen? So müsste ich dies ja bei jedem cout etc. anwenden.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
30.03.2011, 19:12 Uhr
0xdeadbeef
Gott
(Operator)


Das wäre auch eine gute Angewohnheit. Immerhin kannst du dir nie ganz sicher sein, welche Symbole die Standardbibliotheksimplementation, die du gerade benutzt, im Namensraum std anlegt.

Wenn du dazu zu faul bist, kannst du aber auch die benötigten Symbole einzeln ins globale Scope ziehen:

C++:
using std::cout;
using std::cin;
// etc.


Das ist dann immerhin nicht ganz so schlimm wie using namespace. Du könntest deine selbstgeschriebenen Funktionen in einen eigenen Namensraum auslagern:

C++:
namespace dein {
  template<typename T> T max(T lhs, T rhs);
}

// ...

std::cout << dein::max(3, 7);


Du könntest einen Namen benutzen, der sich nicht mit der Standardbibliothek beißt - Portabilitätswarnung siehe oben; mit using namespace bist du nie ganz sicher, was du eigentlich in den globalen Namensraum holst. Du könntest in diesem Fall natürlich auch stumpf std::max benutzen. Damit das überall läuft, musst du dann allerdings <algorithm> einbinden.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 30.03.2011 um 19:14 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
30.03.2011, 19:39 Uhr
citoo



Danke!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: