es una pregunta bastante básica pero no entiendo por qué el código siguiente no se compila en GCC 4.6.1. Que se compila en VS 2008 con SP1:Extraño error de compilación de GCC (ejemplo simple incluido)
#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
}
CCG dice:
[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
Sin embargo, si saco la tercera llamada a 'printValue' entonces se construye y funciona adecuadamente. Entonces, ¿tiene algo que ver con el '?' operador ... ¿no es válido usarlo así? Además, si reemplazo el 'argc < 42' con 'verdadero' o 'falso', también se compilará bien.
¿Alguna idea ?!
¿Error del compilador? –
@VJovic: No, debe haber una definición si es * odr-used *, es decir "a menos que sea un objeto que cumpla los requisitos para aparecer en una expresión constante y la conversión lvalue-r-value se aplica inmediatamente" . Ese es el caso para los argumentos de la función, pero no para el resultado del operador condicional cuando la condición no es una expresión constante y el resultado es un valor l. –
@MikeSeymour: Creo que he leído algunos correos acerca de odr-used y los operadores ternarios, ¿te importaría expandir esto en una respuesta correcta? Realmente me gustaría entender la sutileza aquí. –