2016-02-23 2 views
-2

Salut J'étudie les packs de paramètres. Je viens d'écrire un exemple de code et j'ai quelques bugs.référence non définie à <...> (& ...)

code:

#include <string> 

    using namespace std; 

template<typename T> void inputer(){} 

template<typename T,typename... Rest> void inputer(const T& x, Rest... rest) 
{ 
cin>>x; 
inputer<T>(rest...); 
} 

int main() 
{ 
int a,b; 
inputer<int>(a,b); 
return 0; 
} 

Je ne vois pas d'erreur (je ne suis pas expérimenté avec des packs de paramètres). Comment obtenir un effet comme j'essaye de le faire.

Cordialement

PS: Quand je change

template <typename T> void inputer(){} 

à

template <typename T> void inputer(); 

le code ne compile pas. Pourquoi ?

+1

Vous ne nous ont pas dit quel effet vous essayez d'obtenir, ou ce que vous * êtes * obtenir. Comment pouvons-nous aider? –

+2

@ Jonbi2 Comment vous attendez 'cin >> x;' aller avec 'const T & x' et' Rest' passés par valeur? – LogicStuff

+1

En plus de la réponse donnée: rendre vide le modèle 'inputer' non-template, se débarrasser des arguments explicites du template et laisser la déduction faire son travail. –

Répondre

1

Transmet tous les arguments par référence. Référence à la non-const pour être exact:

template <typename T, typename... Rest> 
void inputer(T& x, Rest&...) { .. } 

cin >> x ne peut pas modifier const int& et si vous passez Rest en valeur, l'entrée ne reflètent pas nécessairement à passer b, mais dans une copie à l'intérieur d'un pack de paramètres.

Pourquoi

template <typename T> void inputer(); 

ne compilera pas?

Parce qu'il doit être défini, pourquoi ne le serait-il pas? S'il avait un code à l'intérieur, il serait exécuté après que tous les arguments aient été imprimés.

De plus, comme mentionné dans les commentaires, le inputer pour aucun argument n'a pas besoin d'être un modèle, juste une surcharge:

void inputer(); 

et RECURSE comme ceci:

inputer(rest...); 

T est faux, cela ne gâchera le tout que si le premier paramètre du pack est différent du premier.

0

Vous avez plusieurs problèmes:

void inputer(const T& x, Rest... rest): x est const et donc pas utilisable pour cin >> x. En outre rest devrait être passé en tant que référence. Changez-le en void inputer(T& x, Rest... rest).

inputer<T>(rest...); doit être inputer<Rest&...>(rest...);

Vous devriez vérifier si cin >> x succeded ou échoue.

Votre inputer a toujours besoin d'au moins un argument de modèle. En raison de sa structure récursive, il pourrait être appelé sans aucun. Vous devriez fournir une solution pour ce cas.


version de travail

#include <string> 
#include <iostream> 

using namespace std; 

template<typename...Args> bool inputer(); 

template<typename T, typename... Rest> 
bool inputer(T& x, Rest&... rest) 
{ 
    if (!(cin >> x)) return false; 
    return inputer<Rest...>(rest...); 
} 

template<typename T> 
bool inputer(T& x) 
{ 
    if (!(cin >> x)) return false; 
    return true; 
} 


int main() 
{ 
    int a = 0, b = 0; 
    inputer<int, int>(a, b); 
    return 0; 
}