【发布时间】:2012-06-05 04:35:44
【问题描述】:
我有一个可变参数模板函数f。这编译得很好(使用g++ -std=c++11 并且可能使用c++0x):
#include <tuple>
template<int ...>
struct seq { };
template <typename ...T, int ...S>
void f(std::tuple<T...> arg, seq<S...> s) {
// ... do stuff
}
int main() {
f<int>(std::tuple<int>(10), seq<0>());
return 0;
}
编译器会自动填写有效的int ...S。
但是,我似乎无法手动提供整数参数:
int main() {
f<int, 0>(std::tuple<int>(10), seq<0>());
return 0;
}
输出:
/tmp/t.cpp:在函数“int main()”中:/tmp/t.cpp:12:42:错误:否
调用‘f(std::tuple, seq)’的匹配函数
/tmp/t.cpp:12:42: 注意: 候选是: /tmp/t.cpp:7:6: 注意:
模板 void f(std::tuple<_telements ...>,
seq) /tmp/t.cpp:7:6: 注意:模板参数
扣减/代换失败:
我相信我已经阅读过,从技术上讲,应该只为模板函数提供一个可变参数模板参数包(在第一种情况下,它完全由上下文决定),因此可以解释它(?)。
对于调试,GCC 中有没有办法将用于...S 的扩展输出到stderr 或stdout?当它们一开始不编译时,它对于调试这样的东西非常有用。
【问题讨论】:
-
什么版本的编译器?代码说明了什么?
-
gcc 4.7。它说它无法确定模板类型。
-
请复制并粘贴实际错误。
-
FTR,-std=c++0x 和 -std=c++11 是一回事。提供前者是为了向后兼容以前版本的编译器。
-
当错误提示它无法确定模板类型时,它永远不会扩展模板 - 能够看到扩展将无济于事。
标签: c++ gcc c++11 variadic-templates