gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:26:54 24 4
gpt4 key购买 nike

以下代码做 不是 用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com