2013-11-09 16 views
5

Ich versuche, eine Zeichenfolge in eine Zahl zu konvertieren. Dafür fand ich die folgende Art und Weise:Kompilierfehler mit Vorlagen - keine passende Funktion für Anruf

#include <iostream> 
#include <string> 

template <typename T> 
T stringToNumber(const std::string &s) 
{ 
    std::stringstream ss(s); 
    T result; 
    return ss >> result ? result : 0; 
} 

int main() 
{ 
    std::string a = "254"; 
    int b = stringToNumber(a); 

    std::cout << b*2 << std::endl; 
} 

Das Problem ist, dass ich die folgende Störung erhalte:

error: no matching function for call to ‘stringToNumber(std::string&)’

jemand May mir sagen, warum ich solche Fehler und wie sie beheben es immer bin?

Vielen Dank im Voraus.

+0

Es sollte der Fehler mehr sein, wie die Tatsache, dass 'T' nicht abgeleitet werden kann. – chris

+1

Sie müssen möglicherweise # # 'oben einschließen, um auch std :: stringstream in Ihren Bereich zu bekommen. –

+0

Yep, erkannte ich, sobald ich es behoben :) – XNor

Antwort

8

Versuchen

int b = stringToNumber<int>(a); 

Da die T Vorlagentyp nicht aus einem der Parameter (in diesem Fall std::string) Sie müssen es explizit geschlossen werden kann definieren.

+0

Ich sehe jetzt, danke. – XNor

+1

Sie meinen * abgeleitet *, nicht * abgeleitet *. Auch C++ 11 fügte "stoi", "stol" usw. hinzu, so dass die Verwendung eines "stringstream" nicht notwendig ist. Und es gibt immer 'boost :: lexical_cast' – Praetorian

+0

@Praetorian, korrekt. "abgeleitet" wurde meiner Antwort von jemand anderem hinzugefügt. –

0

Sie haben kein Vorlagenargument angegeben. Beachten Sie, dass in 11 C++, Sie std::stoi verwenden können:

std::string a = "254"; 
int b = std::stoi(a); 
Verwandte Themen