C2760错误:语法错误,'意外令牌'问题如何解决?
- 内容介绍
- 文章标签
- 相关推荐
本文共计588个文字,预计阅读时间需要3分钟。
使用VS2017和代码:`template void showset(vector v) { for (vector::iterator it=v.begin(); it !=v.end(); it++) { cout << *it; } cout < cpptemplate void showset(vector v) { for (vector::iterator it=v.begin(); it !=v.end(); it++) { cout << *it; } cout < 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 ‘;’ 问题是如何使用模板的迭代器 #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;
}
使用C11的 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版本一样,因为你没有在这里引用迭代器类型,所以没有什么可以放置typename. 请注意,在两个版本中,您都是按值获取参数v.因此,您正在为每个函数调用复制整个向量.由于代码是在问题中给出的,所以似乎没有理由这样做,所以你应该通过引用传递它,并使它成为一个const,因为你没有在showset()内的任何地方修改v: void showset(const std::vector<T>& v);
然后在非基于范围的for循环版本中,不要忘记相应地更改循环语句: for (typename std::vector<T>::const_iterator it = v.begin(); it != v.end(); it++)
auto增强语法,showset()可以像这样编写,然后typename没有用处:)
本文共计588个文字,预计阅读时间需要3分钟。
使用VS2017和代码:`template void showset(vector v) { for (vector::iterator it=v.begin(); it !=v.end(); it++) { cout << *it; } cout < cpptemplate void showset(vector v) { for (vector::iterator it=v.begin(); it !=v.end(); it++) { cout << *it; } cout < 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 ‘;’ 问题是如何使用模板的迭代器 #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;
}
使用C11的 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版本一样,因为你没有在这里引用迭代器类型,所以没有什么可以放置typename. 请注意,在两个版本中,您都是按值获取参数v.因此,您正在为每个函数调用复制整个向量.由于代码是在问题中给出的,所以似乎没有理由这样做,所以你应该通过引用传递它,并使它成为一个const,因为你没有在showset()内的任何地方修改v: void showset(const std::vector<T>& v);
然后在非基于范围的for循环版本中,不要忘记相应地更改循环语句: for (typename std::vector<T>::const_iterator it = v.begin(); it != v.end(); it++)
auto增强语法,showset()可以像这样编写,然后typename没有用处:)

