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