gpt4 book ai didi

c++ - 错误 C2760 : syntax error: unexpected token '<' , 预期 ';'

转载 作者:太空狗 更新时间:2023-10-29 20:20:16 26 4
gpt4 key购买 nike

使用 VS2017 和代码:

template <typename T>
void showset(vector<T> v)
{
for (vector<T>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it;
}
cout << endl;
}

错误是:

error C2760: syntax error: unexpected token , expected ';'

问题是如何使用模板的迭代器

最佳答案

首先请注意,如果引用 template argument dependent name喜欢vector<T>::iterator在这里,那么你需要把typename事先的。此外,取决于什么 T是的,这只会编译如果 std::coutoperator<<正在接受这个 T .例如,这编译得很好:

#include <iostream>
#include <vector>

template <typename T>
void showset(std::vector<T> v)
{
for (typename std::vector<T>::iterator it = v.begin(); it != v.end(); it++)
{
std::cout << *it;
}
std::cout << std::endl;
}

struct foo
{
};

int main()
{
showset(std::vector<int>{1,2,3});
//showset(std::vector<foo>{}); // Error: `cout` doesn't take `foo`s.

return 0;
}

随着 auto -C++11 的增强语法,showset()可以这样写,然后typename没用:)

template <typename T>
void showset(std::vector<T> v)
{
for (auto it = v.begin(); it != v.end(); it++)
{
std::cout << *it;
}
std::cout << std::endl;
}

另外,从 C++11 开始,您可以使用 range-based for loop实现与原始代码段相同的效果:

template <typename T>
void showset(std::vector<T> v)
{
for (auto& ref : v)
{
std::cout << ref;
}
std::cout << std::endl;
}

与 lase 版本一样,因为您在这里指的不是 iterator输入没有什么可放的 typename为。


请注意,在这两个版本中,您都使用参数 v按值(value)。因此,您要为每个函数调用复制整个 vector 。由于问题中给出了代码,因此似乎没有理由这样做,因此您应该通过引用传递它,并将其设为 const。一个也是因为你没有修改 v showset() 内的任何地方:

void showset(const std::vector<T>& v);

然后在非基于范围的 for 循环 版本中不要忘记相应地更改循环语句:

for (typename std::vector<T>::const_iterator it = v.begin(); it != v.end(); it++)

关于c++ - 错误 C2760 : syntax error: unexpected token '<' , 预期 ';',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52384392/

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