给定的
#include <utility>
template <typename T1, typename T2, typename T3>
void foo(std::initializer_list<std::pair<T1, T2>> _a, std::initializer_list<T3> _b) {
/* ... */
}
int main() {
foo({{1,2},{3,4}},{1,2,3,4,5});
}为什么gcc 4.6会产生错误?
error: no matching function for call to ‘foo(<brace-enclosed initializer list>, <brace-enclosed initializer list>)'
note: candidate is
note: template<class T1, class T2, class T3> void foo(std::initializer_list<std::pair<T1, T2> >, std::initializer_list<T3>)
更新现在工作时
template <typename T1, typename T2>
std::pair<T1, T2> p(const T1& _1, const T2& _2) {
return std::make_pair(_1, _2);
}并将{{1,2},{3,4}}替换为{p(1,2), p(3,4)}。
发布于 2011-12-03 12:23:41
您要做的基本上是链式转换/调用,这在C++中是不允许的。
首先你想转换这个,
{{1,2},{3,4}}(在推导类型参数时),
{std::pair<int,int>{1,2},std::pair<int,int>{3,4}}然后进入std::initializer_list。这是不允许的。
你必须自己做一次转换:
foo( {std::pair<int,int>{1,2},std::pair<int,int>{3,4}}, {1,2,3,4,5});然后它将编译:http://ideone.com/bRJqV
https://stackoverflow.com/questions/8367559
复制相似问题