2016-06-29 9 views
11

Podczas kompilowania tego kodu (bez nagłówka)Błąd kompilacji przy użyciu członkiem zdefiniowany przez użytkownika dosłowne

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; 
} 

kompilatorów (zarówno g ++ 4.8, dzyń ++ 3.4 na Ubuntu 14.04) będzie narzekać, że

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

Wygląda na to, że _f.temp jest uważany za sufiks. Dlaczego kompilatory parsują go w ten sposób, zamiast zatrzymywać się na kropce?

+2

Maksymalne chrupanie. '100.0_f.temp' jest poprawnym tokenem * numeru pp *. –

+1

Zmień na '(100.0_f) .temp' – Mine

+0

@ T.C. Nie mam pojęcia, że ​​token numeru pp może zawierać więcej niż jedną kropkę. Czy możesz pokazać mi przykład w takiej formie? – neuront

Odpowiedz

14

Preprocessing numbers to dziwne zwierzęta, określone głównie w celu ułatwienia pisania preprocesora.

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 jest ważne s numer żeton, to jest 0xe+foo (patrz przykład w [lex.pptoken]/4), a więc jest .12.CA'TS_RULE..56.me+owp-urr. Jeśli te dwa ostatnie sprawiają, że minęła faza tłumaczenia 6, to program jest źle sformułowany, ponieważ nie może zostać przekonwertowany na prawidłowy token w fazie 7. Do tego czasu jednak jest ważny, więc maksymalne munch mówi, że parsujemy 0xe+foo lub 100.0_f.temp jako pojedynczy token przetwarzania wstępnego.

+0

Naprawdę bestie. Mam nadzieję, że standard daje aktualizację, aby ułatwić pisanie kodów. – neuront

+2

Nigdy bym nie pomyślał, że '0xe + foo' może być nieprawidłowe C++, to wydaje się takie błędne ... – Holt

Powiązane problemy