调用 std::vector<std::tuple 没有匹配函数> push_back

no matching function for call to std::vector<std::tuple> push_back

本文关键字:std gt 函数 push back lt vector tuple 调用      更新时间:2023-10-16

我有一个包含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;

实例