2012-06-12 13 views
5

El siguiente código muestra 2 plantillas de Foo, cada una con 2 parámetros predeterminados, Foo1 tiene un prototipo separado y Foo2 no, por lo demás son iguales.Dos parámetros predeterminados en la plantilla, ¿qué hay de malo aquí?

¿Por qué la primera llamada a Foo1 causa que el compilador (VS2010 Native C++) produzca un error mientras que los otros 3 funcionan?

#include <limits> 

// not needed but to prevent answers in this direction... 
#undef max 
#undef min 

template< typename T > 
void Foo1(T v1 = std::numeric_limits<T>::min(), T v2 = std::numeric_limits<T>::max()); 

template< typename T > 
inline 
void Foo1(T v1, T v2) 
{ 
    // ... 
} 

template< typename T > 
inline 
void Foo2(T v1 = std::numeric_limits<T>::min(), T v2 = std::numeric_limits<T>::max()) 
{ 
    // ... 
} 

int main() 
{ 
    Foo1<int>(0); /* Will cause error C2589: '::' : illegal token on right side of '::' */ 
    Foo1<int>(0, 10); 
    Foo2<int>(0); 
    Foo2<int>(0, 10); 
} 
+0

He editado el post para proporcionar una 'main()'. De lo contrario, buena pregunta, +1. –

Respuesta

3

trata de un error del compilador según lo informado here. La solución alternativa parece ser:

Gracias por enviar sus comentarios. Si bien reconocemos que este es un error válido del compilador, se encuentra debajo de nuestra barra de triage en este punto del ciclo del producto. La solución consiste en definir la función de plantilla donde la ha declarado. Si le preocupa el impacto de perf de la recompilación de la función de plantilla para cada unidad de traducción, el uso de archivos PCH debería eliminar esta sobrecarga.

Gracias, Mark Roberts Visual C++ Equipo

+0

Thx para esta respuesta rápida y muy al punto. – Halt

Cuestiones relacionadas