错误:没有匹配的函数可用于调用 'std::tuple<std::vector<int, std::allocator<int> >&, int>::tuple()'

问题描述 投票:0回答:1

嘿,我通常使用 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;
}

正如我已经提到的,当我向它传递一个仅接受基本类型作为参数的函数时,该函数就会起作用,只有当该函数接受向量时才会发生错误

c++ c++14
1个回答
1
投票

问题不在于向量,而在于函数将其作为参考。然后,您尝试在此处使用引用元素初始化元组:

return tuple<T...>();
- 但这是行不通的。

根据您在这种情况下想要做什么,您可以例如从

T
s 中删除引用:

template <typename R, typename... T>
auto function_args(R (*)(T...))
{
    return tuple<std::remove_reference_t<T>...>();
}

现场演示

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