2011-05-13 5 views
13

Dado el siguiente código:¿Es esto un error en Visual C++ 2010, o me falta algo?

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

cuando se compila con Visual C++ 2010 (SP1), que obtienen los siguientes errores:

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' 

No entiendo por ellos. Primero, por supuesto, el mensaje de error básicamente resume como "Hay algo mal aquí, pero no le diremos qué". Y en segundo lugar, no encuentro nada incorrecto, ni lo hace g ++ (versión 4.4.2) . Otros síntomas interesantes: Si añade un using std::vector; después de la incluyen, y eliminar todos los std::, funciona — tendría pensado que eso debería tener ningún efecto y si se borra o bien el función f (que en realidad. no se utiliza en cualquier lugar) o la primera versión de la función g, también funciona.

Así que estoy loco, o es realmente VC10 aún no la producción a leer y?

EDITADO: Solo para agregar: si se trata de un error en el compilador, ¿cómo puedo evitarlo?

+0

Originalmente tenían nombres más descriptivos; Estoy obligado a ocultar tanto como sea posible el código real. Los tipos, etc. también fueron más complicados en el original; Intenté simplificar tanto como sea posible. –

+2

Esto * parece * como un error del compilador, mover la segunda versión de 'g' para que se declare primero también parece solucionar el problema. Sugiero que presente un informe de error. –

+0

James I archivó un informe de error con connect.microsoft.com. Vota por ello si quieres verlo reparado en la próxima versión de VC++. Aquí está el enlace: https://connect.microsoft.com/VisualStudio/feedback/details/678280/vc-2010-sp1-compiler-fails-to-parse-conforming-code#details –

Respuesta

0

Funciona bien con el compilador g ++. Por lo tanto, es posible que VC++ no pueda analizar correctamente (puede ser un error en ese caso). Tu código es correcto

3

De hecho, parece un error en el compilador.

En el ejemplo simplificado, el problema desaparece si las dos versiones de g() lugares de intercambio, o si f() está comentada, o f() lugares de intercambio con g<It,Op>(Op, It, It).

Cuestiones relacionadas