2011-05-13 9 views
13

Biorąc pod uwagę następujący kod:Czy jest to błąd w Visual C++ 2010, czy coś mi brakuje?

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

Kiedy skompilowany z Visual C++ 2010 (SP1), pojawia się następujące błędy:

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' 

ja ich nie rozumiem. Po pierwsze, komunikat o błędzie zasadniczo podsumowuje: "Coś tu jest nie tak, ale nie powiemy ci, co to jest" Po drugie, nie znajduję niczego złego, ani też g ++ (wersja 4.4.2) . Inne ciekawe objawy: jeśli dodasz using std::vector; po obejmują, i usunąć wszystkie std::, działa — musiałbym myślał, że nie powinny mieć wpływu a jeśli usunąć albo funkcja f (który naprawdę. nie jest używany nigdzie) lub pierwsza wersja funkcja g, działa również.

Więc jestem szalony, czy VC10 naprawdę jeszcze nie jest produkowany-przeczytaj y?

EDYTOWANA: Aby dodać: jeśli jest to błąd w kompilatorze, w jaki sposób mogę go skutecznie obejść?

+0

Pierwotnie miały bardziej opisowe nazwy; Muszę ukryć jak najwięcej rzeczywistego kodu. Rodzaje itp. Były również bardziej skomplikowane w oryginale; Próbowałem uprościć tak bardzo, jak to możliwe. –

+2

To * wydaje się być jak błąd kompilatora, przenoszenie drugiej wersji 'g', tak aby zadeklarowano ją jako pierwszą, również wydaje się naprawić problem. Proponuję złożyć raport o błędzie. –

+0

James I złożył raport o błędzie na ten temat z connect.microsoft.com. Głosuj na niego, jeśli chcesz go zobaczyć w następnym wydaniu VC++. Oto link do niego: https://connect.microsoft.com/VisualStudio/feedback/details/678280/vc-2010-sp1-compiler-fails-to-parse-conforming-code#details –

Odpowiedz

0

Działa dobrze z kompilatorem g ++. Jest więc możliwe, że VC++ nie jest w stanie poprawnie go przeanalizować (może to być w tym przypadku błąd). Twój kod jest prawidłowy.

3

Rzeczywiście pojawia się błąd w kompilatorze.

W swojej uproszczonej przykład, problem zniknie, jeżeli dwie wersje g() miejsc wymiany, albo jeżeli f() jest wykomentowane lub f() zamieniają się miejscami z g<It,Op>(Op, It, It).

Powiązane problemy