嘿,我通常使用 Javascript 和 dart,但我被要求为某些项目用 C++ 编写一些代码,所以我在编写代码时遇到了很多问题。我遇到了这个错误,我花了几个小时试图解决,但没有任何线索,我最终决定来这里寻求帮助。
首先,我有一个通用函数,它可以根据作为参数传递给它的函数的参数创建一个元组。
template <typename R, typename... T>
tuple<T...> function_args(R (*)(T...))
{
return tuple<T...>();
}
但是每当我向它传递一个以向量作为参数的函数时,它都会抛出错误
/tmp/ViPPynah0U.cpp: In instantiation of 'void function_args(R (*)(T ...)) [with R = int; T = {std::vector<int, std::allocator<int> >&, int}]':
/tmp/ViPPynah0U.cpp:33:18: required from here
/tmp/ViPPynah0U.cpp:23:17: error: no matching function for call to 'std::tuple<std::vector<int, std::allocator<int> >&, int>::tuple()'
这是完整的示例代码以供进一步说明,
#include <iostream>
#include <sstream>
#include <string>
#include <tuple>
#include <vector>
using namespace std;
int example(vector<int> &nums, int target)
{
return 0;
}
template <typename R, typename... T>
tuple<T...> function_args(R (*)(T...))
{
return tuple<T...>();
}
int main(int argc, char const *argv[])
{
auto params = function_args(example);
return 0;
}
正如我已经提到的,当我向它传递一个仅接受基本类型作为参数的函数时,该函数就会起作用,只有当该函数接受向量时才会发生错误
问题不在于向量,而在于函数将其作为参考。然后,您尝试在此处使用引用元素初始化元组:
return tuple<T...>();
- 但这是行不通的。
根据您在这种情况下想要做什么,您可以例如从
T
s 中删除引用:
template <typename R, typename... T>
auto function_args(R (*)(T...))
{
return tuple<std::remove_reference_t<T>...>();
}