Encontré un síntoma muy extraño. ¿Quién puede decirme cuál es la causa raíz?¿Por qué falla el compilador de VC++ 2010 al compilar código simple?
Mi VC++ versión del compilador es más reciente: "Microsoft Visual C++ 2010: 01019-532-2002102-70860"
pasos para reproducir:
- crear un proyecto de consola Win32 vacía
- Agregue un nuevo archivo cpp denominado main.cpp
- Pegue el siguiente código en main.cpp
- Compile
- Los accidentes compilador e informes el siguiente mensaje:
\ error \ main.cpp (54893757): Error grave C1001 : Un error interno ha ocurrido en el compilador. (Archivo del compilador 'msc1.cpp', línea 1420)
Para evitar este problema, intente simplificar o modificar el programa cerca de los lugares indicados anteriormente. Seleccione el comando de soporte técnico en el menú Ayuda de Visual C++, o abra el archivo de ayuda técnica para obtener más información. ocurrió
Este error en el texto inyectada:
d: \ bug \ main.cpp (63): véase referencia a función de plantilla instanciación 'XDummy de prueba (T)' siendo compilado con [ T = int ]
Build FAILED.
A continuación se muestra el código fuente 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 puede reducir su código al código mínimo que causa el error del compilador interno, considere enviar un informe de error a [Microsoft Connect] (http://connect.microsoft.com/). –
Usar la palabra clave auto así parece malo/flojo. No quiero tener que cavar a través de múltiples capas de llamadas a función para averiguar qué tipo devuelve una función. Y si el tipo de devolución de una función interna cambia, preferiría obtener errores de compilación en el punto en que se llamó a la función modificada en lugar de dos capas hacia arriba, preguntándome qué sucedió y teniendo que buscar la causa del cambio () ... Usar auto es útil cuando se definen variables de iterador locales, pero usarlo en firmas de función parece una mala idea. –
@Leo Davidson: No me gusta auto + decltype también. Sin embargo, en muchos casos, auto + decltype es indispensable. Si no es necesario, no los usaré para definir una función. – xmllmx