2017-03-11 1 views
1

J'ai écrit une fonction appelée generate_random_matrix avec un type de retour de auto dans l'extrait de code suivant. Lorsque je mets la fonction avant la fonction main, le code fonctionne bien. Mais quand je mets la fonction ci-dessous la fonction main, et un prototype inclus en haut, le code me donne l'erreur habituelleC++: déclarer le type de retour de la fonction `auto` dans le prototype conduit toujours à l'utilisation de` auto` avant l'erreur de déduction

error: use of ‘auto generate_random_matrix(double, double) [with int rows = 10; int cols = 10]’ before deduction of ‘auto’ 
    auto test_matrix = generate_random_matrix<10,10>(0, 2); 

Voici l'extrait de code réel qui ne fonctionne pas. Des suggestions pour expliquer pourquoi cela ne fonctionne pas?

#include <vector> 
#include <array> 
#include <random> 
#include <iostream> 

std::random_device rd; 
std::mt19937 gen(rd()); 

template <int rows, int cols> 
auto generate_random_matrix(double lower_, double upper_); 

int main() 
{ 
    auto test_matrix = generate_random_matrix<10,10>(0, 2); 
    for (int i = 0; i < 5; ++i) 
    { 
     for (int j = 0; j < 10; ++j) 
     { 
      std::cout << test_matrix[i][j] << " "; 
     } 
     std::cout << "\n"; 
    } 
} 


template <int rows, int cols> 
auto generate_random_matrix(double lower_, double upper_) 
{ 

    std::vector<std::vector<double>> result; 
    std::vector<double> inner_result; 
    for (int i = 0; i < rows; i++) { 
     inner_result.erase(inner_result.begin(), inner_result.end()); 
     for (int j = 0; j < cols; j++) { 
      inner_result.push_back(std::uniform_real_distribution<double>(lower_, upper_)(gen)); 
     } 
     result.push_back(inner_result); 
    } 

    return result; 
} 
+0

Comment le compilateur savoir ce que la fonction retourne, si elle n'a pas vu la définition de fonction (mise en œuvre) encore? –

Répondre

1

Comme d'autres déjà mentionné le auto ne peut pas être déduit en main(), puisque la compilation n'a pas vu le type de retour de la déclaration avant de la fonction modèle.

Il suffit de déplacer la définition entière avant main() pour le faire fonctionner:

#include <vector> 
#include <array> 
#include <random> 
#include <iostream> 

std::random_device rd; 
std::mt19937 gen(rd()); 

template <int rows, int cols> 
auto generate_random_matrix(double lower_, double upper_) 
{ 

    std::vector<std::vector<double>> result; 
    std::vector<double> inner_result; 
    for (int i = 0; i < rows; i++) { 
     inner_result.erase(inner_result.begin(), inner_result.end()); 
     for (int j = 0; j < cols; j++) { 
      inner_result.push_back(std::uniform_real_distribution<double>(lower_, upper_)(gen)); 
     } 
     result.push_back(inner_result); 
    } 

    return result; 
} 

int main() 
{ 
    auto test_matrix = generate_random_matrix<10,10>(0, 2); 
    for (int i = 0; i < 5; ++i) 
    { 
     for (int j = 0; j < 10; ++j) 
     { 
      std::cout << test_matrix[i][j] << " "; 
     } 
     std::cout << "\n"; 
    } 
} 

Voir la Live Demo

+0

D'accord, ça sonne bien. Je n'avais pas vu ce comportement auparavant, mais je peux simplement déplacer le code. Merci pour le conseil. – krishnab

+0

@krishnab Pour le code de production, vous déplaceriez cette définition de fonction dans un fichier d'en-tête de toute façon. –

+0

Bien sûr, cela a du sens. Je l'utilisais pour certains cas de test, mais vous avez raison de le déplacer dans un fichier d'en-tête. Merci encore. – krishnab

0

auto est une indication pour le compilateur de déduire le type à la compilation. Dans votre cas, il doit déduire le type de retour en examinant le code et ainsi il ne parvient pas à déduire dans le prototype parce qu'il ne voit pas le retour (encore) de cette méthode.