Это ошибка в Visual C ++ 2010 или я что-то упустил? - PullRequest
13 голосов
/ 13 мая 2011

С учетом следующего кода:

#include <vector>

template<class C1, class C2, class Op> 
std::vector<typename Op::result_type> 
f(Op op, const C1& src1, const C2& src2)
{
}

template<class It, class Op> 
std::vector<typename Op::result_type> g(Op op, It begin, It end)
{
}

template<class It1, class It2, class Op>
std::vector<typename Op::result_type> g(Op op, It1 left_begin, It1 left_end, It2 right_begin)
{
    return std::vector<typename Op::result_type>();
}

struct ToS
{
    typedef double result_type;
    double operator() (long , double ) const { return 0.0; }
};

std::vector<double> h(std::vector<long> const& vl, std::vector<double> const& vd)
{
    return g(ToS(), vl.begin(), vl.end(), vd.begin());
}

При компиляции с Visual C ++ 2010 (SP1) я получаю следующие ошибки:

1>VC10Error.cpp(30): error C2893: Failed to specialize function template 'std::vector<Op::result_type> g(Op,It1,It1,It2)'
1>          With the following template arguments:
1>          'std::_Vector_const_iterator<_Myvec>'
1>          with
1>          [
1>              _Myvec=std::_Vector_val<long,std::allocator<long>>
1>          ]
1>          'std::_Vector_const_iterator<_Myvec>'
1>          with
1>          [
1>              _Myvec=std::_Vector_val<double,std::allocator<double>>
1>          ]
1>          'ToS'
1>VC10Error.cpp(30): error C2780: 'std::vector<Op::result_type> g(Op,It,It)' : expects 3 arguments - 4 provided
1>          VC10Error.cpp(12) : see declaration of 'g'

Я их не понимаю. Во-первых, конечно, сообщение об ошибке в основном резюмирует: «Здесь что-то не так, но мы не скажем вам, что». И во-вторых, я не нахожу ничего плохого; ни g ++ (версия 4.4.2). Другие интересные симптомы: если вы добавите using std::vector; после включить и удалить все std::, это работает & mdash; я бы думал, что это не должно иметь никакого эффекта. И если вы удалите либо функция f (которая на самом деле нигде не используется) или первая версия функция g, это также работает.

Так я сумасшедший или VC10 действительно еще не готов к производству?

РЕДАКТИРОВАНИЕ: Просто добавлю: если это ошибка в компиляторе, как мне надежно ее обойти?

Ответы [ 2 ]

3 голосов
/ 13 мая 2011

Действительно, в компиляторе появляется ошибка.

В вашем упрощенном примере проблема исчезнет, ​​если две версии g() поменялись местами, или если f() закомментировано, или f() обменяться местами с g<It,Op>(Op, It, It).

0 голосов
/ 13 мая 2011

Отлично работает с компилятором g ++.Таким образом, возможно, что VC ++ не сможет разобрать его должным образом (в этом случае это может быть ошибка).Ваш код правильный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...