当前位置 : 主页 > 编程语言 > c++ >

c – 错误C2760:语法错误:意外令牌’<',预期';'

来源:互联网 收集:自由互联 发布时间:2021-06-23
使用VS2017和代码: template typename Tvoid showset(vectorT v){ for (vectorT::iterator it = v.begin(); it != v.end(); it++) { cout *it; } cout endl;} 错误是: error C2760: syntax error: unexpected token , expected ‘;’ 问题是如
使用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 ‘;’

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

首先请注意,如果在此处引用类似于矢量< T> :: iterator的 template argument dependent name,则需要先输入typename.此外,取决于T是什么,只有当std :: cout的运算符<<正在接受这个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;
}

使用C11的auto增强语法,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版本一样,因为你没有在这里引用迭代器类型,所以没有什么可以放置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++)
网友评论