首页 > 解决方案 > 使用数组构造函数的模板作为函数返回类型

问题描述

我对 C++ 中的模板函数有点陌生,遇到了一个问题,我无法通过谷歌搜索找到任何结果。

尝试在这里使用模板来生成不同维度的数组。代码如下所示:

 template <size_t T> 
 vector<array<float, T>> poissonSample(size_t T, float r) {
    array<float, T> x_min, x_max;

    return samples;
  }

但是,当我尝试使用以下内容调用该函数时,该函数的定义似乎很好:

poissonSample(4, 0.3f);

编译器将报告“没有函数模板的实例与参数列表匹配。

在此处输入图像描述

这里有什么问题?

标签: c++templates

解决方案


这是我在 onlinegdb.com 编译的代码

#include <vector>
#include <array>

using namespace std;


template <size_t T> 
vector<array<float, T>> poissonSample(size_t T, float r);

int main()
{
    auto res = poissonSample(4, 1.0f)
    return 0;
}

以下是错误消息的全文:

main.cpp:17:46: error: declaration of ‘size_t T’ shadows template parameter
 vector<array<float, T>> poissonSample(size_t T, float r);
                                              ^
main.cpp:16:11: note: template parameter ‘T’ declared here
 template <size_t T>
           ^~~~~~
main.cpp: In function ‘int main()’:
main.cpp:21:37: error: no matching function for call to ‘poissonSample(int, float)’
     auto res = poissonSample(4, 1.0f)
                                     ^
main.cpp:17:25: note: candidate: template std::vector > poissonSample(size_t, float)
 vector<array<float, T>> poissonSample(size_t T, float r);
                         ^~~~~~~~~~~~~
main.cpp:17:25: note:   template argument deduction/substitution failed:
main.cpp:21:37: note:   couldn't deduce template parameter ‘T’
     auto res = poissonSample(4, 1.0f)

如您所见,根本问题是size_t T函数参数和size_t T模板参数不相关。一种是编译时构造,另一种是运行时构造。

第二个问题是

main.cpp:17:25: note:   template argument deduction/substitution failed:

编译器无法计算出你的 T。

正确的用法是:

template <size_t T> 
vector<array<float, T>> poissonSample(float r);

int main()
{
    auto res = poissonSample<4>(1.0f);
    return 0;
}

(这只给出一个链接器错误,提供你自己的实现)


推荐阅读