C'est une question assez simple mais je ne comprends pas pourquoi le code ci-dessous ne compile pas sur GCC 4.6.1. Il ne compile sur VS 2008 avec SP1:Erreur de compilation étrange de GCC (exemple simple inclus)
#include <iostream>
class MyClass
{
public:
const static int MinValue = -1000;
const static int MaxValue = 1000;
};
void printValue(int i)
{
std::cout << i << std::endl;
}
int main(int argc, char** argv)
{
printValue(MyClass::MinValue);
printValue(MyClass::MaxValue);
printValue(argc < 42 ? MyClass::MinValue : MyClass::MaxValue); //This line gives the error
}
GCC dit:
[email protected]:~/temp$ g++ test.cpp
/tmp/ccN2b95G.o: In function `main':
test.cpp:(.text+0x54): undefined reference to `MyClass::MinValue'
test.cpp:(.text+0x5c): undefined reference to `MyClass::MaxValue'
collect2: ld returned 1 exit status
Cependant, si je prends le troisième appel à 'printValue' il construit et fonctionne correctement. Donc c'est quelque chose à voir avec le '?' opérateur ... n'est-il pas valide de l'utiliser comme ça? De plus, si je remplace le 'argc < 42' par 'vrai' ou 'faux', il se construit également très bien.
Des idées ?!
Bogue du compilateur? –
@VJovic: Non - il doit y avoir une définition si elle est * odr-used *, c'est-à-dire "sauf si c'est un objet qui satisfait aux exigences pour apparaître dans une expression constante et la conversion lvalue-to-rvalue est immédiatement appliquée" . C'est le cas pour les arguments de la fonction, mais pas pour le résultat de l'opérateur conditionnel lorsque la condition n'est pas une expression constante et que le résultat est un lvalue. –
@MikeSeymour: Je pense avoir lu des courriels à propos d'odr-used et des opérateurs ternaires, cela vous dérangerait-il de développer une bonne réponse? J'aimerais vraiment comprendre la subtilité ici. –