给出以下代码:
#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::
,它有用 - 我会
认为这应该没有效果。如果你删除了
函数f
(实际上没有在任何地方使用)或第一版
函数g
,它也有效。
我疯了,还是VC10还没准备好生产?
编辑:只是补充一下:如果是编译器中的错误,我该如何可靠地解决它?
答案 0 :(得分:3)
确实,它似乎是编译器中的一个错误。
在您的简化示例中,如果g()
的两个版本交换位置,或f()
被注释掉,或f()
与g<It,Op>(Op, It, It)
交换位置,则问题就会消失
答案 1 :(得分:0)
它适用于g ++编译器。因此VC ++可能无法正确解析它(在这种情况下可能是一个错误)。你的代码是正确的。