2

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

prog.cpp:11:73:错误:在函数体 prog.cpp:11:73 外使用参数“N”
:错误:在函数体 prog.cpp:11:73 外使用参数“N”
:错误:使用函数体
prog.cpp:11:89外的参数“N” :错误:模板参数 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);
}

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

4

2 回答 2

5

您正在尝试使用函数参数Noperator[]在编译时不知道)作为模板参数,std::tuple_element在编译时必须知道该参数。

于 2013-04-29T22:53:57.250 回答
2

模板参数N是编译时的东西,而operator[]参数N只在运行时实现。编译器不知道是什么N,因此无法将其理解为模板参数。

于 2013-04-29T22:54:06.767 回答