2017-03-11 7 views
1

generate_random_matrixという関数を返します。返り値の型はです。 main関数の前に関数を置くと、コードは正常に動作します。しかし、私はmain機能の下の関数を入れ、上部のプロトタイプが含まれている場合、コードは私の通常のエラーになります。ここC++:プロトタイプで `auto`関数の戻り型を宣言すると、減算前に` auto`が使用されています

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); 

が動作していない実際のコードスニペットです。なぜこれが機能していないのかについての示唆はありますか?

#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

(実装を参照してください。 )まだ? –

答えて

1

すでに述べたように、main()ではautoは推測できません。コンパイルでは、テンプレート関数の前方宣言からの戻り値の型が見つからなかったためです。

ちょうどそれが働いて取得するmain()前に定義全体を移動:

#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"; 
    } 
} 

は、関数定義を見ていない場合、コンパイラは、どのような機能のリターンを知っているだろうかLive Demo

+0

さて、いいよ。私はこれまでこの動作を見ていませんでしたが、コードを移動するだけで済みます。先端に感謝します。 – krishnab

+0

@krishnabプロダクションコードでは、その関数定義をヘッダファイルに移動します。 –

+0

確かに意味があります。私はこれをいくつかのテストケースに使用していましたが、ヘッダーファイルに移動することは正しいです。再度、感謝します。 – krishnab

0

autoコンパイル時にタイプを推測するようにコンパイラへのヒントです。あなたのケースでは、コードを調べることによって戻り値の型を推論しなければならないため、そのメソッドの戻り値(まだ)が見えないため、プロトタイプで推測できません。

関連する問題