Templated initialization_list - почему поиск не удался - PullRequest
2 голосов
/ 03 декабря 2011

С учетом

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

1 Ответ

2 голосов
/ 03 декабря 2011

То, что вы пытаетесь сделать, это в основном цепочка преобразование / вызов, что недопустимо в C ++.

Сначала вы хотите преобразовать это,

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

в это (при выводе аргумента 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

...