2013-04-29 47 views
1

我试图超载[]运营商,所以我可以访问std::tuple的元素。出于某种原因,我收到以下错误:为什么我得到“在函数体外使用参数'N'”?

prog.cpp:11:73: error: use of parameter ‘N’ outside function body
prog.cpp:11:73: error: use of parameter ‘N’ outside function body
prog.cpp:11:73: error: use of parameter ‘N’ outside function body
prog.cpp:11:89: error: template argument 1 is invalid

很奇怪,因为他们大多是第一次的重复。我不明白为什么我得到这个错误,因为不是晚期返回类型的全部要点,以便我们可以使用返回类型的参数?

#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); 
} 

如果任何人都可以解释为什么这种情况正在发生,我怎么能得到这个工作,这将是非常赞赏。谢谢。

+1

想想你要的是什么,一分钟。您希望函数的*类型根据传递给它的(运行时变化的)*值*而改变?这可能会以非类型化的脚本语言飞行,但不能用C++语言。 – 2013-04-29 22:59:25

回答

5

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

+0

为什么在编译时不能知道它? – 2013-04-29 22:59:13

+4

@templateboy:因为我可以写'size_t我; cin >> i; cout << yourobject [i];'编译器在那里使用哪一个'operator <<'重载? – 2013-04-29 23:00:54

+1

有什么办法可以使参数'constexpr'? – 2013-04-29 23:03:55

2

模板参数N是编译时的东西,而operator[]参数N仅在运行时实现。编译器不知道N是什么,所以它不能把它作为模板参数。

相关问题