为什么我得到“在函数体外使用参数'N'”?
我试图超载[]
运营商,所以我可以访问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);
}
如果任何人都可以解释为什么这种情况正在发生,我怎么能得到这个工作,这将是非常赞赏。谢谢。
您正在尝试使用函数参数N
从operator[]
(这是在编译时不知道)作为std::tuple_element
模板参数,它必须在编译时是已知的。
为什么在编译时不能知道它? – 2013-04-29 22:59:13
@templateboy:因为我可以写'size_t我; cin >> i; cout 2013-04-29 23:00:54
有什么办法可以使参数'constexpr'? – 2013-04-29 23:03:55
模板参数N
是编译时的东西,而operator[]
参数N
仅在运行时实现。编译器不知道N
是什么,所以它不能把它作为模板参数。
想想你要的是什么,一分钟。您希望函数的*类型根据传递给它的(运行时变化的)*值*而改变?这可能会以非类型化的脚本语言飞行,但不能用C++语言。 – 2013-04-29 22:59:25