Ответ 1
В самом деле, он появляется в компиляторе.
В упрощенном примере проблема исчезнет, если две версии g()
меняются местами, или если f()
закомментирован, или f()
обмениваются местами с g<It,Op>(Op, It, It)
.
С учетом следующего кода:
#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 С++ 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::
, он работает & должен;
думал, что это не должно иметь никакого эффекта. И если вы удалите либо
функция f
(которая действительно нигде не используется) или первая версия
функция g
, она также работает.
Я тоже с ума, или VC10 действительно еще не готов к производству?
EDITED: просто добавьте: если это ошибка в компиляторе, как мне надёжно работать?
В самом деле, он появляется в компиляторе.
В упрощенном примере проблема исчезнет, если две версии g()
меняются местами, или если f()
закомментирован, или f()
обмениваются местами с g<It,Op>(Op, It, It)
.
Он отлично работает с компилятором g++. Таким образом, возможно, что VС++ не может правильно разобрать его (может быть, ошибка в этом случае). Ваш код правильный.