首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模板化initialization_list -为什么查找失败

模板化initialization_list -为什么查找失败
EN

Stack Overflow用户
提问于 2011-12-03 12:13:17
回答 1查看 119关注 0票数 2

给定的

代码语言:javascript
复制
#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>)

更新现在工作时

代码语言:javascript
复制
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)}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-03 12:23:41

您要做的基本上是链式转换/调用,这在C++中是不允许的。

首先你想转换这个,

代码语言:javascript
复制
{{1,2},{3,4}}

(在推导类型参数时),

代码语言:javascript
复制
{std::pair<int,int>{1,2},std::pair<int,int>{3,4}}

然后进入std::initializer_list。这是不允许的。

你必须自己做一次转换:

代码语言:javascript
复制
foo( {std::pair<int,int>{1,2},std::pair<int,int>{3,4}}, {1,2,3,4,5});

然后它将编译:http://ideone.com/bRJqV

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8367559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档