gpt4 book ai didi

c++ - 使用 C++11 编译后模板函数损坏

转载 作者:太空狗 更新时间:2023-10-29 19:40:10 27 4
gpt4 key购买 nike

我有一个非常简单的模板函数来比较两个 structsrank 字段:

template<typename T>
bool comp_rank(const T &a, const T &b){
return a.rank < b.rank;
}

在我使用 -std=c++11 进行编译之前,它工作得很好。现在,我得到了错误

error: parameter "b" is not a type name
return a.rank < b.rank;
^

./src/util.h(123): error: expected a ">"
return a.rank < b.rank;
^

什么给了?这似乎是我惊讶地发现在 C++11 之后发生了变化的基本语法。

最佳答案

编辑:我已向 gcc here 提交错误报告.目前尚未确认。

假设您接受了 @Klaus' answer , 你的代码看起来像 like this (感谢@krzaq):

#include <type_traits>

using namespace std;

struct A{ int rank; };

template<typename T>
bool comp_rank(const T &a, const T &b){
return a.rank < b.rank;
}

int main()
{
A a{42}, b{0};
comp_rank(a, b);
}

gcc(9.0.0 及更早版本已测试)和 clang(8.0.0 及更早版本已测试)拒绝此代码,理由是它们期望 id-expression a.rank<成为模板的开始。按照标准,这是错误的解释。请参阅 [basic.lookup.classref]

In a class member access expression, if the . or -> token is immediately followed by an identifier followed by a <, the identifier must be looked up to determine whether the < is the beginning of a template argument list or a less-than operator. The identifier is first looked up in the class of the object expression. If the identifier is not found, it is then looked up in the context of the entire postfix-expression and shall name a class template.

编译器应该查找a.rank并发现它是类 A 的整数成员. MSVC 19.00.23506 compiles it just fine

关于c++ - 使用 C++11 编译后模板函数损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53712642/

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