没有调用 std::vector<std::tuple> push_back 的匹配函数
no matching function for call to std::vector<std::tuple> push_back
我有一个包含 6 个时间点的示例程序,使用来自标准 chrono
header 的 high_resolution_clock::now()
。我将差异 b/w 中的每一个都导致 3 个差异并将它们转换为 auto duration1 = std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count();
到微秒。
我有另一个名为 durations 的变量,其分配如下:auto durations = std::make_tuple(duration1,duration2,duration3);
包含之前的 time-point 差异。
我必须将这个元组推入一个向量,所以我引入了 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
内容 here 但没有成功解决问题。
我知道这与我对类型系统的疏忽有关,但我无法找到该错误。任何帮助将不胜感激,这里是 ideone link.
#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 个持续时间的向量中。
I take differences b/w each of them resulting in 3 differences and caste them as auto duration1 = std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count();
to microseconds.
为什么在执行 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
的调用,直到您尝试打印内容。
您的类型不匹配。
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;
很简单:不要调用 count
。
std::chrono::microseconds
是(在您的情况下)类型 std::chrono::duration<long long int, std::ratio<1ll, 1000000ll> >
的 typedef。这也是您通过 std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 )
.
获得的类型
但是,这不是您分配给 duration1
的内容。您正在分配对该类型调用 count
函数的结果。 returns 刻度数作为数字(long long int
在你的标准库的情况下),而不是 duration
.
我有一个包含 6 个时间点的示例程序,使用来自标准 chrono
header 的 high_resolution_clock::now()
。我将差异 b/w 中的每一个都导致 3 个差异并将它们转换为 auto duration1 = std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count();
到微秒。
我有另一个名为 durations 的变量,其分配如下:auto durations = std::make_tuple(duration1,duration2,duration3);
包含之前的 time-point 差异。
我必须将这个元组推入一个向量,所以我引入了 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
内容 here 但没有成功解决问题。
我知道这与我对类型系统的疏忽有关,但我无法找到该错误。任何帮助将不胜感激,这里是 ideone link.
#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 个持续时间的向量中。
I take differences b/w each of them resulting in 3 differences and caste them as
auto duration1 = std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count();
to microseconds.
为什么在执行 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
的调用,直到您尝试打印内容。
您的类型不匹配。
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;
很简单:不要调用 count
。
std::chrono::microseconds
是(在您的情况下)类型 std::chrono::duration<long long int, std::ratio<1ll, 1000000ll> >
的 typedef。这也是您通过 std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 )
.
但是,这不是您分配给 duration1
的内容。您正在分配对该类型调用 count
函数的结果。 returns 刻度数作为数字(long long int
在你的标准库的情况下),而不是 duration
.