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

标签 c++ templates compiler-errors compiler-bug

以下代码做 不是 用 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< ... 中生成单个 token 但随后它找不到 >完成它。

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

关于模板类中结构的 C++ 编译器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60095134/

相关文章:

r - 无法理解 "Rstudio pdf knit fails with ' 环境阴影未定义'错误”

c# - String.Format 类实用程序的正则表达式

iphone - Lion上Xcode 4.1的奇怪编译错误

c++ - 局部变量的安全

c++ - Qt QMenu延迟初始化

c++ - 在模板中使用 lambda 函数的性能?

c++ - std::conditional 如何工作

C++ 对象创建

compiler-errors - 在 64 位 Linux 上编译 32 位 libGLEW.so

java - 从 Java 中的另一个类调用方法不起作用?