模板化初始化列表 - 为什么查找失败

发布于 2024-12-19 06:12:11 字数 1012 浏览 2 评论 0 原文

考虑到

#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: nomatching function for call to 'foo(, )'

注意:候选者为

注:template void foo(std::initializer_list >, std::initializer_list)

更新 现在,当

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)} 时可以使用>。

Given

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

why does gcc 4.6 produce the error

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>)

Update
Now works when

template <typename T1, typename T2>
std::pair<T1, T2> p(const T1& _1, const T2& _2) {
    return std::make_pair(_1, _2);
}

is added and {{1,2},{3,4}} is replaced with {p(1,2), p(3,4)}.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梦罢 2024-12-26 06:12:12

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

首先,您需要将其转换

{{1,2},{3,4}}

为 this(同时推导 type 参数),

{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

What you're trying to do is basically chained conversion/invocation, which is not allowed in C++.

First you want to convert this,

{{1,2},{3,4}}

into this (while deducing the type argument),

{std::pair<int,int>{1,2},std::pair<int,int>{3,4}}

which then into std::initializer_list. It is not allowed.

You've to do one conversion yourself:

foo( {std::pair<int,int>{1,2},std::pair<int,int>{3,4}}, {1,2,3,4,5});

then it will compile : http://ideone.com/bRJqV

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文