将模板用作数组构造函数作为函数返回类型

时间:2019-05-29 00:12:20

标签: c++ templates

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

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

enter image description here

这是什么问题?

1 个答案:

答案 0 :(得分:3)

这是我在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;
}

(这只会产生链接器错误,请提供您自己的实现)