gpt4 book ai didi

c++ - 如何专门化 std::begin?

转载 作者:可可西里 更新时间:2023-11-01 15:46:37 27 4
gpt4 key购买 nike

我正在尝试为自定义容器专门化 std::begin。我这样做是因为我想对容器使用基于范围的 for。这是我的:

class stackiterator { … };
class stack { … };

#include <iterator>

template <> stackiterator std::begin(stack& S)
{
return S.GetBottom();
}

我在 begin 特化的定义中遇到以下错误:

No function template matches function template specialization 'begin'

我做错了什么?

最佳答案

I'm trying to specialize std::begin for a custom container. I'm doing this because I want to use range-based for with the container.

你找错人了。基于范围的 for 根本不使用 std::begin。对于类类型,编译器直接查找成员 beginend,如果两者都没有找到,则免费进行仅 ADL 查找 beginend 在关联的命名空间中。不执行普通的不合格查找;如果您的类不在 std 命名空间中,则无法获取 std::begin

即使你想做的特化是可能的(除非你引入一个成员 begin() - 一个函数模板的显式特化不能改变返回类型,并且有问题的重载返回“任何成员 begin() 返回”;如果你确实引入了一个成员 begin(),你为什么要专门化 std::begin 来做它本来应该做的事情?),你仍然无法将它与基于范围的 for 一起使用。

关于c++ - 如何专门化 std::begin?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31445809/

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