MSVC 8.0 SP1 Compiler Bug oder dummer bär?
-
Kann mir einer erklären wieso im folgenden Beispiel viele hübsche C3861 fliegen?
#include <typeinfo> // header 'typeinfo' defines class 'type_info' - C++ is seriously fucked up :) namespace nsa { struct a { a(){} a operator + (int) { return a(); } }; int get(a const&) { return 0; } } // namespace a int main() { nsa::a a; get(a); // OK get(a + 1); // OK get(a + *typeid(int).name()); // OK get(a + *typeid(int(2)).name()); // C3861 get(a + *typeid(a).name()); // C3861 get(a + *static_cast<std::type_info const&>(typeid(int(2))).name()); // C3861 get(a + *static_cast<std::type_info const*>(&typeid(int(2)))->name()); // C3861 std::type_info const& ti = typeid(int(2)); get(a + *ti.name()); // OK. WTF?!? get(a + *typeid(&a).name()); // C3861 get(a + *typeid(*&a).name()); // C3861 get(a + *typeid(static_cast<nsa::a*>(0)).name()); // C3861 return 0; }
Ich gehe mal stark davon aus dass es ein Compiler Bug ist. Drübergestolpert bin ich bei boost::format(), wollte eben den Typ einer Exception rausloggen.
Comeau Online frisst den Code ohne Probleme.Kennt jmd. das Phänomen?
p.S.: mit Angabe des Namespace (nsa::get(...)) findet VC die get() Funktion immer.
-
Hab keine AHnung was Du hier machst, aber poste es mal hier:
http://connect.microsoft.com/VisualStudio/feedback/
-
Ich würd sagen falsches Unterforum, im C++ Forum kennt man sich damit viel besser aus.
-
Hab keine AHnung was Du hier machst
Ich habe nur versucht ein minimales Beispiel zu konstuieren. Du kannst den Fehler auch so bekommen (das war auch der Fall wo ich drübergestolpert bin):
#include <exception> #include <boost/format.hpp> std::string get_exception_info(std::exception const& e) { // boost::str() sollte hier über ADL (koenig lookup) gefunden werden, // was aber MSVC auf Grund des typeid() Aufrufs nichtmehr checkt. // Wenn du typeid(e) durch typeid(int) ersetzt geht es. // (typeid(type) scheint kein problem zu machen, typeid(instance) dagegen schon) return str(boost::format( "type: %1% message: %2%") % typeid(e).name() % e.what()); }
p.S.: MSVC 2008 (9.0) macht genau dasselbe wie MSVC 2005 (8.0)
-
Hast Du es schon auf Connect gepostet?
Oder am besten den MS Produkt-Support anrufen!