Le problème est que le compilateur ne peut pas utiliser le type de retour pour en déduire les types de la fonction. Vous devez fournir explicitement le type que vous voulez dans le cadre de l'appel de la fonction, comme @Naveen déjà mentionné: getFromString<int>("123")
. Une autre approche est en train de changer la signature de la fonction de sorte qu'au lieu de le renvoyer reçoit le type d'argument:
template <typename T>
void getFromString(const std::string & str, T & value) { ... }
int main() {
int x;
getFromString("123",x);
}
Comme vous fournissez une variable de type T
dans l'appel, le compilateur est maintenant en mesure de déduire le type de la arguments. (x
est un int
, vous appelez donc getFromString<int>
). L'inconvénient est que vous devez créer la variable à l'avance et le code utilisateur sera plus compliqué pour les cas d'utilisation simples comme int n = getFromString<int>("123");
alors que c'est un bon conseil, il ne fait rien pour répondre à la question. –
Pas vraiment, mais vous pourriez noter que l'utilisation est exactement la même. Cependant, je crois fermement à ne pas réinventer la roue, surtout quand 'lexical_cast' est susceptible d'être beaucoup plus rapide pour les types entiers en raison d'un réglage minutieux;) –