Je doute que gcc 4.8.3 inline des fonctions de template incorrectes ... Ce problème ne se produit pas en mode debug, mais seulement en mode optimisé. Cependant, cela se produit dans une base de code compliquée, je ne suis pas capable de reproduire le problème dans un cas de test simple.gcc inline la fonction de template générique avec une définition spécialisée
Mon code est comme ce qui suit
#include "stdio.h"
class A {
public:
template<typename T> int WriteNative(const T) {
printf("here?\n")
return 0;
}
template<typename D>
void doit() {
if (WriteNative<double>(1)) {
printf("A\n");
} else {
printf("B\n");
}
}
};
// in my real code, this definition is in a different cpp file
template<> int A::WriteNative<double>(const double) {
return 1;
}
int main() {
A a;
a.doit<float>();
}
En version debug, il imprime A, tandis que dans la construction optimisée, il imprime ici? \ NB
Je suppose que tout Inliner utilise le modèle générique définition de la fonction, mais pas celle spécialisée. Mais attribut ((noinline)) n'aide pas.
Est-ce que quelqu'un si mon code a un comportement défini de C++? et comment résoudre ce problème?
Ma solution de contournement que j'ai trouvée est en insérant les définitions spécialisées: http://stackoverflow.com/questions/4445654/multiple-definition-of-template-specialization-when-using-different-objects. –