gpt4 book ai didi

c++ - 如何使用迭代器和用户类正确地制作模板函数

转载 作者:行者123 更新时间:2023-12-02 10:11:39 24 4
gpt4 key购买 nike

我正在学习 c++,并决定用模板和迭代器做一些事情。
但是当我开始尝试在我的类中使用我的代码时,它停止工作,因为我不能在我的类中使用类似于::iterator 我在模板函数中使用的东西。

#include <vector>

template <class Iterator>
struct Page {
std::vector<Iterator> data;

auto begin() const { return *data.begin(); }
auto end() const { return *data.end(); }
};

template <typename Iterator>
struct My_struct {
My_struct(Iterator begin, Iterator end) { /*...*/ }
/*...*/
};

template <typename C>
My_struct<typename C::iterator> fun(C& c) {
return { c.begin(), c.end() };
}

int main()
{
Page<std::vector<int>::iterator> pag;
auto b = fun(pag); //

std::vector<std::vector<int>::iterator> vec;
auto a = fun(vec);
}

Error E0304no instance of function template "fun" matches the argument list 25

最佳答案

My_struct <typename C::iterator>是错误源,因为 Page没有iterator成员(Page::iterator 不存在)。
还有,这

auto begin() const { return *data.begin(); }
auto end() const { return *data.end(); }
将导致段错误,因为 vector 中没有元素,因此您不应该取消引用迭代器:
auto begin() const { return data.begin(); }
auto end() const { return data.end(); }
为了制作 fun工作,你可以使用 auto作为返回类型, template argument deduction :
template <typename C>
auto fun(C& c) {
//^^-- auto as return type
return My_struct{ c.begin(), c.end() };
// ^^^^^^^^^^---- template argument deduction
}
你最终会得到:
#include <vector>

template <class Iterator>
struct Page {
std::vector<Iterator> data;

auto begin() const { return data.begin(); }
auto end() const { return data.end(); }
};

template <typename Iterator>
struct My_struct {
My_struct(Iterator begin, Iterator end) { /*...*/ }
/*...*/
};

template <typename C>
auto fun(C& c) {
return My_struct{ c.begin(), c.end() };
}

int main()
{
Page<std::vector<int>::iterator> pag;
auto b = fun(pag); //

std::vector<std::vector<int>::iterator> vec;
auto a = fun(vec);
}
应该可以正常工作

关于c++ - 如何使用迭代器和用户类正确地制作模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63314700/

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