J'ai rencontré un symptôme très étrange. Qui peut me dire quelle est la cause première?Pourquoi le compilateur VC++ 2010 plante-t-il lors de la compilation de code simple?
version du compilateur de mon CV est le dernier: "Microsoft Visual C++ 2010: 01019-532-2002102-70860"
Procédure pour reproduire:
- Créer un projet console win32 vide
- Ajouter un nouveau fichier cpp nommé main.cpp
- Collez le code suivant dans main.cpp
- Compile
- Les accidents du compilateur et des rapports le message suivant:
\ bug \ main.cpp (54893757): erreur fatale C1001 : Une erreur interne est survenue dans le compilateur. (Fichier compilateur « de msc1.cpp », ligne 1420)
Pour contourner ce problème, essayez simplifier ou modifier le programme près des endroits indiqués ci-dessus. Veuillez sélectionner la commande Support technique dans le menu Aide de Visual C++, ou ouvrez le fichier d'aide du support technique pour plus d'informations.
Cette erreur est survenue dans le texte injecté:
d: \ bug \ main.cpp (63): voir référence à la fonction modèle instanciation 'XDummy test (T)' étant compilé avec [ T = int ]
Échec de construction.
est en dessous du code source de main.cpp:
#include <vector>
template<class It_>
struct trait_dummy
{
static const int value = std::tr1::is_convertible<typename iterator_traits<It_>::iterator_category, int>::value;
};
template<class It_>
class X
{
public:
template<class T_>
X(T_& rColl)
{}
};
template<class T_>
X<typename T_::iterator> f(T_ rColl, std::false_type)
{
return X<typename T_::iterator>(rColl);
}
template<class T_>
auto f(T_& rColl) -> decltype(f(rColl, std::false_type()))
{
return f(rColl, std::false_type());
}
template<class It_>
X<It_> f(It_ first, size_t nSize, typename std::tr1::enable_if<trait_dummy<It_>::value>::type* dummy = 0)
{
return X<It_>(first, first + nSize);
}
class XTest
{
public:
void foo()
{
auto v = f(m_Suite);
}
std::vector<int> m_Suite;
};
const int g_dummy = 0;
class XDummy
{
public:
XDummy(int, int, int, int dummy = g_dummy)
{}
};
template<class T>
XDummy Test(T)
{
return XDummy(0, 0, 0);
}
int main()
{
Test(0);
//XTest().foo();
return 0;
}
Si vous pouvez réduire votre code au code minimum qui provoque l'erreur interne du compilateur, veuillez envoyer un rapport de bogue sur [Microsoft Connect] (http://connect.microsoft.com/). –
Utiliser le mot-clé auto comme ça semble mauvais/paresseux. Je ne veux pas avoir à explorer plusieurs couches d'appel de fonction pour savoir quel type renvoie une fonction. Et si le type de retour d'une fonction interne change, je préférerais avoir des erreurs de compilateur au moment où la fonction modifiée a été appelée plutôt que deux couches, se demandant ce qui s'est passé et ayant à chercher la cause de la modification (s)) ... L'utilisation de l'auto est pratique lors de la définition des variables locales de l'itérateur, mais l'utiliser dans les signatures de fonctions semble être une mauvaise idée. –
@Leo Davidson: Je n'aime pas auto + decltype aussi. Cependant, dans de nombreux cas, auto + decltype est indispensable. Si ce n'est pas nécessaire, je ne les utiliserai pas pour définir une fonction. – xmllmx