Possible Duplicate:
GCC problem : using a member of a base class that depends on a template argumentconstantes definidas en clases de plantilla
pensé que estaba familiarizado con C++, pero al parecer no lo suficientemente familiar.
El problema es que cuando define una constante en una clase de plantilla, puede usar la constante en las nuevas clases que derivan de esa clase, pero no las nuevas plantillas que derivan de ella.
Por ejemplo, gcc dice
test.h:18: error: ‘theconstant’ was not declared in this scope
cuando intento compilar este (simplificado) archivo de cabecera:
#pragma once
template <typename T> class base
{
public:
static const int theconstant = 42;
};
class derive1 : public base<size_t>
{
public:
derive1(int arg = theconstant) {}
};
template<typename T> class derive2 : public base<T>
{
public:
derive2(int arg = theconstant) {} // this is line 18
};
Así que el problema es que una clase, derive1
, compila bien, pero el otra clase, derive2
, que es una especialización de plantilla, no lo hace.
Ahora tal vez el error de gcc no es lo suficientemente claro, pero no entiendo por qué el constructor en derive2
tendría un alcance diferente al de derive1
.
En caso de que importe, esto ocurre durante la compilación del archivo de encabezado, no al crear un objeto de tipo derive2<type>
.
También sé qué cambiar para hacer esta compilación, así que realmente no estoy buscando códigos de una línea como respuestas. Quiero entender por qué esto sucede! Intenté buscar en la web, pero aparentemente no estoy usando los argumentos de búsqueda correctos.
FWIW, este mismo código compila bien en VC++ 2010. Esto podría ser un error en GCC ... – dsharlet
'derive2 (int arg = base :: theconstant) {}' compila bien. –
jrok
@dsharlet - no es un error en la parte de GCC, como se describe en la especificación. – Flexo