gpt4 book ai didi

c++ - "end"不能在模板函数中使用

转载 作者:可可西里 更新时间:2023-11-01 16:29:48 26 4
gpt4 key购买 nike

我想在函数模板中使用一个简单的结构,其成员变量名为 startend:

#include <iostream>
using namespace std;

struct st {
int start;
int end;
};

template<typename T>
void compare(const T& v1, const T& v2){
if(v1.end < v2.end)
cout << "v1 < v2" << endl;
}

int main() {
st a = {1, 2};
st b = {2, 3};
compare(a, b);
return 0;
}

但是这个程序无法在 mingw g++ 4.8.2 上编译:

main.cpp: In function 'void compare(const T&, const T&)':
main.cpp:11:11: error: parse error in template argument list
if(v1.end < v2.end)
^
main.cpp: In instantiation of 'void compare(const T&, const T&) [with T = st]':
main.cpp:18:17: required from here
main.cpp:11:5: error: 'end' is not a member template function
if(v1.end < v2.end)
^

为什么不呢?我的代码有什么问题?

最佳答案

这显然是一个 gcc 错误(特别是 10200,尽管有几个带有很多不同示例的骗子)。 [temp.names] 状态:

When the name of a member template specialization appears after . or -> in a postfix-expression or after a nested-name-specifier in a qualified-id, and the object expression of the postfix-expression is type-dependent or the nested-name-specifier in the qualified-id refers to a dependent type, but the name is not a member of the current instantiation (14.6.2.1), the member template name must be prefixed by the keyword template. Otherwise the name is assumed to name a non-template. [ Example:

struct X {
template<std::size_t> X* alloc();
template<std::size_t> static X* adjust();
};

template<class T> void f(T* p) {
T* p1 = p->alloc<200>(); // ill-formed: < means less than
T* p2 = p->template alloc<200>(); // OK: < starts template argument list
T::adjust<100>(); // ill-formed: < means less than
T::template adjust<100>(); // OK: < starts template argument list
}

—end example ]

v1v2类型相关的,因此由于省略了template,因此应假设该名称命名为非模板关键字和 <应该被视为小于,就像上面的例子一样。

更不用说 [basic.lookup.classref] 指出:

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.

end应该清楚地在对象表达式的类中找到 - 毕竟它是一个简单的成员变量。 end 失败的事实只是因为与 std::end() 的碰撞进一步支持错误的想法,因为从不应该考虑该范围。

有趣的是,最简单的解决方案很简单:don't use using namespace std; !

关于c++ - "end"不能在模板函数中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31690932/

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