Şablon sınıfındaki yapıda C ++ derleyici sorunu


13

Aşağıdaki kod yok değil gcc veya clang derlemek.

template<class T>
class foo{};

template<class T>
class template_class_with_struct
{
    void my_method() {
        if(this->b.foo < 1);
    };

    struct bar
    {
        long foo;
    } b;
};

Hata mesajı:

error: type/value mismatch at argument 1 in template parameter list for 'template<class T> class foo'    
    8 |         if(this->b.foo < 1);

Hata templat sınıf foo neden olur. <1 yerine <= yazarken derler.

Takdir edilen herhangi bir ipucu var mı?

CompilerExplorer bağlantısı https://godbolt.org/z/v6Tygo


7
Derleyici hatalar söyleyebilirim ama msvc onu kabul etmek için tek: - / Demo . Olası geçici çözüm b.bar::fooveya parantez ( (this->b.foo) < 1)
Jarod42

Yanıtlar:


1

GCC'de,

so.cpp:8:27: error: expected '>'
    if(this->b.foo < 1) 
                      ^

Derleyici foo, bu satırdaki öğenin fooyukarıdaki sınıfa başvurduğunu ve bir şablon argümanı beklediğini düşünüyor. Bu gördüğünüze benzer.

Bunu değiştirdiğinizde <=, lexer tarafından tek bir belirteç olarak belirtilir. Bir sonraki aşama a'yı bile görmez <, bu yüzden onun tarafından karıştırılmaz.

Sınıfı, uzun süre ile aynı ada barsahip olmayacak şekilde değiştirirseniz, bu sorunla karşılaşılmaz. Ayrıca, @ Jarod42, sorunuzun yorumunda önerilere sahiptir (daha fazla nitelik veya ebeveyn).

Derleyiciler, her aşamanın kodu bir sonraki için daha iyi bir temsile çevirdiği aşamalar halinde yazılır ve her aşama bu temsil ile daha karmaşık şeyler yapabilir.

Başlangıçta, derleyici dosyadaki karakterleri bir jeton akışına dönüştüren kodu "lexes" - bu satırı aşağıdaki gibi görür

// if(this->b.foo < 1) 
- keyword(if)
- left-paren
- keyword(this)
- operator(->)
- name(b)
- operator(.)

Ve sonra foo. Muhtemelen yapmalı

- name(foo)
- operator(<)
- number(1)
- right-paren

Ama bana göre foo, gördüğü zaman , ileriye bakıyor, var ve <gerçeği görüyor ve foo<class T>tek bir jeton yapmaya çalışıyor foo< ...ama sonra bunu >tamamlamak için bulamıyor .

Bu sadece bir tahmindir - isimleri bulmaya çalışan ve simgeleri birleştirebilen lexer'ın ötesinde bir sahne olabilir. Her durumda, foo'nun çoklu kullanımları onu kandırıyor.


Açıklamanızı anlıyorum, ancak derleyicinin bu şekilde davranması gerektiği anlamına gelmiyor. Belki de bu farklı derleyiciler için bir hata alanı olmalıdır. Bazen bağlantılı bir kütüphane üstbilgisinde hangi şablon sınıflarının (
cnt

Bence bu bir hata, ama spesifikasyonun ne dediğini bilmiyorum. 3. taraf başlıklarından adlara sahip olmak sorunlara neden olur.
Lou Franco
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.