Ich habe einen Code gefunden, den ich denke sollte kompilieren, tut es aber nicht. Ich hoffe also, dass einige der lokalen Standardsxperten hier bei SO helfen können :-).Potentieller g ++ Template Bug?
Ich habe im Grunde einen Code, der dies ähnelt:
#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;
}
Also, um zu beschreiben, was hier vor sich geht. Ich habe eine Klassenvorlage (A
), die eine interne Klasse (U
) und mindestens eine Memberfunktion hat, die eine Instanz dieser internen Klasse (f()
) zurückgeben kann.
Dann versuche ich eine operator==
Funktion zu erstellen, die diesen internen Typ mit einem anderen Typ vergleicht (in diesem Fall ein int
, aber es scheint keine Rolle zu spielen).
Wenn USE_FIX
ist nicht definiert bekomme ich folgende Fehlermeldung:
test.cc: In function 'int main()':
test.cc:27:25: error: no match for 'operator==' in 'a.A<T>::f [with T = int]() == 1'
Welche scheint seltsam, weil ich klar bin (glaube ich) ein Templat-operator==
definiert, die diese in der Tat decken sollte, wenn ich nur Mach ein wenig von der Arbeit für den Compiler (aktiviere USE_FIX), dann bekomme ich keinen Fehler mehr. Leider funktioniert das "Fix" nicht generisch, nur für eine bestimmte Instanziierung der Vorlage.
Soll das so funktionieren, wie ich es erwartet habe? Oder ist das einfach nicht erlaubt?
BTW: Wenn es darauf ankommt, verwende ich gcc 4.5.2.
Es ist einfach nicht erlaubt. Wenn ich mehr über Ihr Problem wissen würde, könnte ich Ihnen ein entsprechendes Redesign empfehlen. –
+1 für eine gute Frage. :-) – Nawaz
möglich duplicate of [Wie kann man den Klassentyp vom Methodentyp in C++ - Templates ableiten?] (Http://stackoverflow.com/questions/3830491/how-to-deduce-class-type-from-method-type-) in-c-templates) –