C ++:在原型中声明`auto`函数返回类型仍导致在演绎错误之前使用`auto`

时间:2017-03-11 10:12:09

标签: c++ prototype auto

我在下面的代码片段中编写了一个名为generate_random_matrix的函数,返回类型为auto。当我将函数放在main函数之前时,代码工作正常。但当我把函数放在main函数下面,并在顶部包含一个原型时,代码给了我通常的错误

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

2 个答案:

答案 0 :(得分:1)

正如其他人已经提到的那样auto无法在main()中推断出来,因为编译没有从模板化函数的前向声明中看到返回类型。

只需在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

答案 1 :(得分:0)

auto是编译器在编译时推断出类型的提示。在你的情况下,它必须通过检查代码来推断返回类型,因此它无法在原型中推断,因为它没有看到该方法的返回。