调用 std::vector<std::tuple 没有匹配函数> push_back
no matching function for call to std::vector<std::tuple> push_back
我有一个包含6个时间点的示例程序,使用标准chrono
头的high_resolution_clock::now()
。我把它们的差异b/w每个产生3个差异,并将它们命名为auto duration1 = std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count();
到微秒。
我有另一个名为duration的变量,其分配如下:auto durations = std::make_tuple(duration1,duration2,duration3);
包含先前的时间点差异。
我必须把这个元组推到一个向量中,所以我引入了std::vector<std::tuple<std::chrono::microseconds,std::chrono::microseconds,std::chrono::microseconds>> list;
,但是在使用list.push_back(durations);
时,我得到了一个错误:
prog.cpp: In function 'int main()':
prog.cpp:36:29: error: no matching function for call to 'std::vector<std::tuple<std::chrono::duration<long long int, std::ratio<1ll, 1000000ll> >, std::chrono::duration<long long int, std::ratio<1ll, 1000000ll> >, std::chrono::duration<long long int, std::ratio<1ll, 1000000ll> > > >::push_back(std::tuple<long long int, long long int, long long int>&)'
list.push_back(durations);
我试着在这里搜索std::chrono::microseconds
和其他std::chrono::duration
的东西,但没有成功地纠正问题。
我知道这与我对类型系统的疏忽有关,但我无法找到那个错误。任何帮助都会很感激,&这是ideone的链接
#include <iostream>
#include <chrono>
#include <vector>
#include <tuple>
using namespace std;
using namespace std::chrono;
void function()
{
long long number = 0;
for( long long i = 0; i != 2000000; ++i )
{
number += 5;
}
}
int main()
{
high_resolution_clock::time_point t1 = high_resolution_clock::now();
high_resolution_clock::time_point t3 = high_resolution_clock::now();
high_resolution_clock::time_point t5 = high_resolution_clock::now();
function();
high_resolution_clock::time_point t2 = high_resolution_clock::now();
high_resolution_clock::time_point t4 = high_resolution_clock::now();
high_resolution_clock::time_point t6 = high_resolution_clock::now();
auto duration1 = std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count();
auto duration2 = std::chrono::duration_cast<std::chrono::microseconds>( t4 - t3 ).count();
auto duration3 = std::chrono::duration_cast<std::chrono::microseconds>( t6 - t5 ).count();
auto durations = std::make_tuple(duration1,duration2,duration3);
std::vector<std::tuple<std::chrono::microseconds,std::chrono::microseconds,std::chrono::microseconds>> list;
list.push_back(durations);
cout << duration1 << " -- "<< duration2 << " -- "<< duration3 << " -- ";
return 0;
}
您创建了一个由3个整数组成的元组,并试图将其添加到3个持续时间的向量中。
我把它们的差异b/w每个产生3个差异,并将它们命名为
auto duration1 = std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count();
到微秒。
为什么在执行duration_cast
转换为微秒后调用count()
的持续时间?
只要保持microseconds
对象的值,你可以把它们添加到向量:
auto duration1 = std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 );
auto duration2 = std::chrono::duration_cast<std::chrono::microseconds>( t4 - t3 );
auto duration3 = std::chrono::duration_cast<std::chrono::microseconds>( t6 - t5 );
std::chrono::microseconds::count()
的类型不是std::chrono::microseconds
,而是某种有符号整型
auto duration1 = std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count();
//decltype(duration1) is not std::chrono::microseconds
因此,您不能将duration*n*
变量用于期望microsecond
值的向量。
修复方法很简单,只要推迟调用count
,直到您尝试打印内容。
这很简单:不要调用count
。
std::chrono::microseconds
(在您的例子中)是类型std::chrono::duration<long long int, std::ratio<1ll, 1000000ll> >
的类型定义。这也是你从做std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 )
得到的类型。
然而,这不是你分配给duration1
的。您正在对该类型调用count
函数的结果进行赋值。它返回一个数字(在标准库中是long long int
),而不是duration
。
您正在获得类型不匹配。
auto duration1 = std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count()
实际上给你一个long long
在你的情况下,而不是std::chrono::microseconds
。您可以通过使用decltype()
并更改
std::vector<std::tuple<std::chrono::microseconds,std::chrono::microseconds,std::chrono::microseconds>> list;
std::vector<decltype(durations)> list;
实例
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- std::原子加载和存储都需要吗
- 将对象移动到std::shared_ptr
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 是std :: set&lt; std :: future&gt;不可能存在
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- 使用 std::vector<boost::shared_ptr<Base_Class>> 或 boost::p tr_vector 的性能注意事项是什么<Base>
- std::map<std::set, double> AND std:<long>map< std::p air<long, long>, double>
- 如何获取std::vector<DMatch>