如何在 C++20 中传递 valarray 或向量作为参数

问题描述 投票:0回答:1
我想要一个可以接受 valarray 或向量作为参数的函数。下面的(简单示例)代码在 C++17 中运行良好(编译、运行并给出正确答案),但无法在 C++20 中编译并出现错误消息

'GetSum':找不到匹配的重载函数

如果我直接调用指针版本,它可以工作,但如果我可以直接传递容器,它显然会更整洁。

template<class T> T GetSum(std::valarray<T>& vIn) { return GetSum(&vIn[0], vIn.size()); } template<class T> T GetSum(std::vector<T>& vIn) { return GetSum(&vIn[0], vIn.size()); // could use .data() here } // pointer version template<class T> T GetSum(T* vIn, size_t n) { T sum{}; for (size_t i = 0; i < n; ++i) sum += vIn[i]; return sum; } void OnTest() { std::vector<double> vec(10, 1); std::valarray<int> val(3, 10); double x = GetSum(vec); int i = GetSum(val); ...
抱歉我的无知,但是有人可以告诉我我做错了什么吗?
(仅供参考,我不久前问过一个关于这个主题的问题,这就是我如何让 C++17 代码正常工作,但现在我试图转移到 C++20 并发现我的代码不再工作)。 

c++ vector migration c++20 valarray
1个回答
1
投票
有人可以告诉我我做错了什么吗?

问题

是你在声明它之前已经声明/定义了你试图调用GetSum的指针版本。

要解决此问题,您可以在使用/调用它之前移动其声明,如下所示:

//first declare/define this template<class T> T GetSum(T* vIn, size_t n) { T sum{}; for (size_t i = 0; i < n; ++i) sum += vIn[i]; return sum; } //now you can use the above template<class T> T GetSum(std::vector<T>& vIn) { return GetSum(&vIn[0], vIn.size()); } template<class T> T GetSum(std::valarray<T>& vIn) { return GetSum(&vIn[0], vIn.size()); }

工作演示

© www.soinside.com 2019 - 2024. All rights reserved.