繁体   English   中英

模板类中结构的 C++ 编译器问题

[英]C++ compiler issue with struct in template class

以下代码不能用 gcc 或 clang 编译。

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

错误信息是

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

该错误是由模板类 foo 引起的。 当编写 <= 而不是 < 1 时,它也会编译。

任何提示赞赏?

CompilerExplorer 链接https://godbolt.org/z/v6Tygo

在海湾合作委员会中,我得到

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

因此,编译器认为该行上的foo指的是上面的foo类,并且需要一个模板参数。 这与您所看到的类似。

当您将其更改为<= ,词法分析器将其标记为单个标记。 下一阶段甚至看不到< ,因此不会被它混淆。

如果您将类更改为与bar的 long 不同的名称,则不会出现此问题。 此外,@ Jarod42 在他对您的问题的评论中提出了建议(更多资格或括号)。

编译器是分阶段编写的,每个阶段将代码转换为下一个更好的表示,并且每个阶段可以使用该表示做越来越复杂的事情。

一开始,编译器对代码进行“词法分析”,将文件中的单个字符转换为标记流——它会将这一行视为类似

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

然后它到达foo 应该可以

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

但是,在我看来,当它看到foo ,它向前看,看到<以及foo<class T>存在的事实,它试图从foo< ...创建一个标记foo< ...但它不能找到>来完成它。

这只是一个猜测——它可能是词法分析器的一个阶段,它试图找到名称并可以组合标记。 无论如何, foo 的多种用途正在欺骗它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM