为什么我会“在函数体外使用参数'N'?”

时间:2013-04-29 22:49:48

标签: c++ c++11

我正在尝试重载[]运算符,以便我可以访问std::tuple的元素。出于某种原因,我收到以下错误:

  

prog.cpp:11:73:错误:在函数体外使用参数'N'   prog.cpp:11:73:错误:在函数体外使用参数'N'   prog.cpp:11:73:错误:在函数体外使用参数'N'   prog.cpp:11:89:错误:模板参数1无效

非常奇怪,因为大多数都是第一次重复。而且我不明白为什么我得到那个错误,因为不是后期返回类型的全部意义是我们可以使用参数作为返回类型?

#include <tuple>

template <class... Args>
struct type_list
{
    std::tuple<Args...> var;

    type_list(Args&&... args) : var(std::forward<Args>(args)...) {}

    auto operator[](std::size_t const N) -> typename std::tuple_element<N, std::tuple<Args...>>::type&&
    {
        return std::get<N>(var);
    }
};

int main()
{
    type_list<int, int, bool> array(2, 4, true);
}

如果有人能够解释为什么会发生这种情况以及如何让它发挥作用,那将非常感激。感谢。

2 个答案:

答案 0 :(得分:5)

您尝试使用N中的函数参数operator[](编译时未知)作为std::tuple_element的模板参数,必须在编译时知道

答案 1 :(得分:2)

模板参数N是编译时的事情,而operator[]参数N仅在运行时实现。编译器不知道N是什么,所以它不能将它理解为模板参数。