2017-03-11 6 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

automain()에서 추론 할 수 없습니다. 컴파일시 템플릿 기능의 순방향 선언에서 반환 유형이 표시되지 않았기 때문입니다.

그냥 작동 얻을 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는 컴파일 타임에 유형을 추론 할 수있는 컴파일러 힌트입니다. 귀하의 경우에는 코드를 검토하여 반환 유형을 추론해야하므로 해당 메소드의 반환 (아직)을 알 수 없으므로 프로토 타입에서 추론하지 못합니다.