Di GCC, saya mengerti
so.cpp:8:27: error: expected '>'
if(this->b.foo < 1)
^
Jadi, kompiler berpikir bahwa foo
pada baris itu merujuk ke kelas di foo
atas dan mengharapkan argumen templat. Ini mirip dengan apa yang Anda lihat.
Ketika Anda mengubahnya ke <=
, yang tokenized oleh lexer sebagai token tunggal. Tahap selanjutnya bahkan tidak melihat a <
, jadi tidak bingung olehnya.
Jika Anda mengubah kelas untuk tidak memiliki nama yang sama dengan yang lama bar
, maka tidak memiliki masalah ini. @ Jarod42 juga memiliki saran dalam komentarnya untuk pertanyaan Anda (lebih banyak kualifikasi atau parens).
Kompiler ditulis dalam tahap, di mana setiap tahap menerjemahkan kode ke representasi yang lebih baik untuk selanjutnya, dan setiap tahap dapat melakukan hal-hal yang semakin kompleks dengan representasi itu.
Pada awalnya, kompiler "lexes" kode, yang mengubah karakter individu dalam file menjadi aliran token - itu akan melihat baris ini sebagai sesuatu seperti
// if(this->b.foo < 1)
- keyword(if)
- left-paren
- keyword(this)
- operator(->)
- name(b)
- operator(.)
Dan kemudian sampai ke foo
. Mungkin harus dilakukan
- name(foo)
- operator(<)
- number(1)
- right-paren
Tapi, bagi saya itu terlihat seperti ketika dilihat foo
, terlihat di depan, melihat <
dan fakta yang foo<class T>
ada dan mencoba membuat satu token dari foo< ...
tetapi kemudian tidak dapat menemukan >
untuk menyelesaikannya.
Ini hanya dugaan - itu bisa menjadi tahap melewati lexer yang mencoba mencari nama dan dapat menggabungkan token. Bagaimanapun, berbagai penggunaan foo menipu itu.
b.bar::foo
atau kurung ((this->b.foo) < 1
)