[英]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.