gpt4 book ai didi

c++ - T::iterator 出错,其中模板参数 T 可能是 vector 或 list

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:03:51 26 4
gpt4 key购买 nike

我正在尝试编写一个函数来打印常见 STL 容器( vector 、列表等)的表示。我给了函数一个模板参数 T,例如,它可能代表 vector 。我在获取 T 类型的迭代器时遇到问题。

vector<int> v(10, 0);
repr< vector<int> >(v);

...

template <typename T>
void repr(const T & v)
{
cout << "[";
if (!v.empty())
{
cout << ' ';
T::iterator i;
for (i = v.begin();
i != v.end()-1;
++i)
{
cout << *i << ", ";
}
cout << *(++i) << ' ';
}
cout << "]\n";
}

...

brett@brett-laptop:~/Desktop/stl$ g++ -Wall main.cpp
main.cpp: In function ‘void repr(const T&)’:
main.cpp:13: error: expected ‘;’ before ‘i’
main.cpp:14: error: ‘i’ was not declared in this scope
main.cpp: In function ‘void repr(const T&) [with T = std::vector<int, std::allocator<int> >]’:
main.cpp:33: instantiated from here
main.cpp:13: error: dependent-name ‘T::iterator’ is parsed as a non-type, but instantiation yields a type
main.cpp:13: note: say ‘typename T::iterator’ if a type is meant

我按照编译器的建议尝试了“typename T::iterator”,但只得到了一个更神秘的错误。

编辑:感谢大家的帮助!这是适用于任何想要使用此功能的人的工作版本:

template <typename T>
void repr(const T & v)
{
cout << "[";
if (!v.empty())
{
cout << ' ';
typename T::const_iterator i;
for (i = v.begin();
i != v.end();
++i)
{
if (i != v.begin())
{
cout << ", ";
}
cout << *i;
}
cout << ' ';
}
cout << "]\n";
}

最佳答案

您需要typename 来告诉编译器::iterator 应该是一个类型。编译器不知道它是一个类型,因为在您实例化模板之前它不知道 T 是什么。例如,它也可以引用一些静态数据成员。这是你的第一个错误。

您的第二个错误是 v 是对 const 的引用。因此,您必须使用 ::const_iterator 而不是 ::iterator。您不能向常量容器请求非常量迭代器。

关于c++ - T::iterator 出错,其中模板参数 T 可能是 vector<int> 或 list<int>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3735022/

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