He encontrado algún código que I piensa debe compilar, pero no lo hace. Así que espero que algunos de los expertos en estándares locales aquí en SO puedan ayudar :-).Posible error de plantilla de g ++?
, básicamente, tienen un código que se parece a esto:
#include <iostream>
template <class T = int>
class A {
public:
class U {
};
public:
U f() const { return U(); }
};
// test either the work around or the code I want...
#ifndef USE_FIX
template <class T>
bool operator==(const typename A<T>::U &x, int y) {
return true;
}
#else
typedef A<int> AI;
bool operator==(const AI::U &x, int y) {
return true;
}
#endif
int main() {
A<int> a;
std::cout << (a.f() == 1) << std::endl;
}
Por lo tanto, para describir lo que está pasando aquí. Tengo una plantilla de clase (A
) que tiene una clase interna (U
) y al menos una función miembro que puede devolver una instancia de esa clase interna (f()
).
Luego intento crear una función operator==
que compare este tipo interno con otro tipo (en este caso, un int
, pero no parece importar).
Cuando USE_FIX
es no definido me sale el siguiente error:
test.cc: In function 'int main()':
test.cc:27:25: error: no match for 'operator==' in 'a.A<T>::f [with T = int]() == 1'
que parece extraño, porque yo soy claramente (creo) que define una plantilla operator==
que debe cubrir esto, de hecho si sólo hacer un poco del trabajo para el compilador (habilitar USE_FIX), entonces ya no me sale un error. Desafortunadamente, la "corrección" no funciona genéricamente, solo para una instanciación específica de la plantilla.
¿Se supone que funciona como esperaba? ¿O simplemente esto no está permitido?
Por cierto: si es importante, estoy usando gcc 4.5.2.
Simplemente no está permitido. Si supiera más sobre su problema, podría sugerir un rediseño apropiado. –
+1 para una buena pregunta. :-) – Nawaz
posible duplicado de [¿Cómo deducir el tipo de clase del tipo de método en las plantillas C++?] (Http://stackoverflow.com/questions/3830491/how-touceded-class-type-from-method-type- in-c-templates) –