模板函数中的“std::remove”导致“vector.begin()”为“const”时出现问题

Nic*_*ack 3 c++ templates

错误消息:“二进制‘==’:找不到采用‘const _Ty’类型的左操作数的运算符(或者没有可接受的转换)”

该错误似乎是因为我为第一个参数给出了std::remove一个const值,但我没有确切地看到v.begin()不可修改会如何导致问题,也没有看到为什么只有在向量的类型是模板化的情况下才会发生此错误,而不是向量的类型已知类型向量。

模板函数:

// Erases a every element of a certain value from a vector
template <typename T>
std::vector<T> eraseElement(std::vector<T> v, T elem)
{
    typename std::vector<T>::iterator newEnd = std::remove(v.begin(), v.end(), elem);
    v.erase(newEnd, v.end());
    return v;
}
Run Code Online (Sandbox Code Playgroud)

我调用模板函数的方式的示例:

struct exampleStruct
{
    int x;
}

std::vector<exampleStruct> v;
exampleStruct elem;
elem.x = 2451;
v.push_back(elem);

v = eraseElement(v, elem);
Run Code Online (Sandbox Code Playgroud)

Cal*_*eth 5

也不知道为什么仅当向量的类型是模板化的(而不是已知类型的向量)时才会发生此错误。

如果您手动替换,也会发生这种情况exampleStruct

std::vector<exampleStruct> eraseElement(std::vector<exampleStruct> v, exampleStruct elem)
{
    auto newEnd = std::remove(v.begin(), v.end(), elem);
    v.erase(newEnd, v.end());
    return v;
}
Run Code Online (Sandbox Code Playgroud)

那是因为没有operator==for exampleStruct。你可能想要类似的东西

bool operator==(const exampleStruct & lhs, const exampleStruct & rhs)
{
    return lhs.x == rhs.x;
}
Run Code Online (Sandbox Code Playgroud)

或使用 C++20 实现

struct exampleStruct 
{
    int x;
    friend bool operator==(const exampleStruct &, const exampleStruct &) = default;
};
Run Code Online (Sandbox Code Playgroud)