2016-06-29 11 views
11

Quando compila questo codice (senza intestazione)errore di compilazione quando si utilizza un membro di un definito dall'utente letterale

template <typename T> 
struct Temperature { 
    T temp; 

    explicit Temperature(T t) 
     : temp(t) 
    {} 
}; 

Temperature<long double> operator "" _f (long double t) 
{ 
    return Temperature<long double>((t - 32)/1.8); 
} 

int main() 
{ 
    auto t = 100.0_f; 
    t.temp; 

    100.0_f.temp; // ERROR AT THIS LINE 
    return 0; 
} 

I compilatori (sia g ++ 4.8 e clangore ++ 3.4 Ubuntu 14.04) si lamentano che

error: unable to find numeric literal operator ‘operator"" _f.temp’ 
    100.0_f.temp; 
    ^

Sembra che lo _f.temp sia considerato un suffisso lì. Perché i compilatori la analizzano così, invece di fermarsi al punto?

+2

Munch massimo. '100.0_f.temp' è un token * pp-number * valido. –

+1

Passare a '(100.0_f) .temp' – Mine

+0

@ T.C. Non ho idea che un token numero-pp possa contenere più di un punto. Potresti mostrarmi un esempio in questa forma? – neuront

risposta

14

Preprocessing numbers sono animali dispari, specificati principalmente per semplificare la scrittura del preprocessore.

pp-number: 
    digit 
    . digit 
    pp-number digit 
    pp-number identifier-nondigit 
    pp-number ' digit 
    pp-number ' nondigit 
    pp-number e sign 
    pp-number E sign 
    pp-number p sign 
    pp-number P sign 
    pp-number . 

12 è una valida pp numero gettone, quindi è 0xe+foo (vedere l'esempio nella [lex.pptoken]/4), e quindi è .12.CA'TS_RULE..56.me+owp-urr. Se gli ultimi due superano la fase di traduzione 6, allora il programma è mal formato perché non può essere convertito in un token valido nella fase 7. Fino a quel momento, tuttavia, è valido, così il munch massimo dice che analizziamo 0xe+foo o 100.0_f.temp come un singolo token di preelaborazione.

+0

Davvero bestie. Spero che lo standard fornisca un aggiornamento per semplificare la scrittura dei codici. – neuront

+2

Non avrei mai pensato che '0xe + foo' potesse essere un C++ non valido, questo sembra così sbagliato ... – Holt

Problemi correlati