Bug im MS-Complier VC8.0
-
folgender Code führt zu einem Compilefehler
#include <boost/type_traits/is_integral.hpp> #include <boost/utility/enable_if.hpp> #include <iostream> class X { struct enabler {}; public: template< typename E > X( E c, typename boost::enable_if< boost::is_integral< E >, enabler >::type = enabler() ) : m_c(static_cast< unsigned char >( c )) {} template< typename E, typename Traits > friend std::basic_ostream< E, Traits >& operator<<( std::basic_ostream< E, Traits >& out, X x ); private: unsigned char m_c; }; template< typename E, typename Traits > std::basic_ostream< E, Traits >& operator<<( std::basic_ostream< E, Traits >& out, X x ) { return out << x.m_c; }; class Foo { public: Foo( ) : m_out( 0 ) {} template< typename I > void put( I first, I last ) { for( ; first != last; ++first ) std::cout << X( *first ); } private: std::ostream m_out; }; void test( Foo* s ) { std::cout << 'x'; const char txt[] = "123456"; s->put( txt, txt + 4 ); }Fehler:
main_ng.cpp(11) : fatal error C1004: unexpected end-of-file found main_ng.cpp(49) : see reference to function template instantiation 'void Foo::put<const char*>(I,I)' being compiled 1> with 1> [ 1> I=const char * 1> ]Der Hinweis auf Zeile 11 und Zeile 49 stimmt mit dem Listing oben überein.
Der Compilefehler verschwindet, wenn ich die Zeile 47 weglasse oder(!) wenn ich die Zeile 49 weglasse oder(!) wenn ich den Member m_out Zeile 42 weglasse (obwohl der gar nicht benutzt wird) oder wenn ich das boost::enable_if weglasse.
Meines Erachtens ist das ein Bug im MS-Compiler - oder habt Ihr eine andere Idee.
Die boost-Version ist im Original 1.35. Und mit V1.41 habe ich das gleiche Verhalten.
Gruß
Werner
-
mit VS 2010 und boost 1.43 compiliert es.
-
also schrieb:
mit VS 2010 und boost 1.43 compiliert es.
Danke für die Info - wobei zwischen dem C++-Compiler vom VS 2005 (=V8.0) und dem von VC2010 wohl ein Riesenunterschied besteht.
Kann es nochmal jemand mit VC++8.0 (alias VS 2005) ausprobieren.
Wie melde ich so einen Fehler (wenn es denn einer ist) an Microsoft. Aus der MSDN werde ich da nicht schlau.
Gruß
Werner
-
Visual C++ 2008 kompiliert es nicht, selbe Fehlermeldung wie geposted.
-
Mit VS2005 kann ich das auch reproduzieren. Es verschwindet auch wenn put keine template methode ist.