gpt4 book ai didi

c++ - std::find 在 std::vector> 上失败并出现 "no match for ‘operator==’“当 T 在 namespace 中时出现错误

转载 作者:搜寻专家 更新时间:2023-10-31 00:06:22 25 4
gpt4 key购买 nike

我目前正在从事一个大型代码项目,想借此机会了解和使用命名空间。我定义的所有类都位于一个 namespace Test 中。

我的其中一个类(此处称为 Thing)具有唯一 ID。我需要能够保存对某些事物的引用的 std::vector,因此我正在使用 std::reference_wrappers。在程序的某些位置,我需要从 vector 中删除某些 std::reference_wrappers,因此我使用 std::find:

#include <algorithm>
#include <functional>
#include <vector>

namespace Test {

class Thing {
private:
const int id;

public:
Thing(int id);
const int ID() const;
};

}

Test::Thing::Thing(int id) : id(id) { }

const int Test::Thing::ID() const {
return id;
}

inline bool operator==(const Test::Thing& lhs, const Test::Thing& rhs) {
return lhs.ID() == rhs.ID();
}
inline bool operator!=(const Test::Thing& lhs, const Test::Thing& rhs) {
return !(lhs == rhs);
}

int main() {
Test::Thing t1(5);
Test::Thing t2(7);

auto ref1 = std::ref(t1);
auto ref2 = std::ref(t2);

std::vector<std::reference_wrapper<Test::Thing>> v;
v.push_back(ref1);
v.push_back(ref2);

auto pos = std::find(v.begin(), v.end(), ref2);
}

当我尝试编译它时,出现错误:

error: no match for ‘operator==’ (operand types are ‘std::reference_wrapper<Test::Thing>’ and ‘const std::reference_wrapper<Test::Thing>’)

但是,如果我删除 namespace ,代码将正确编译:

#include <functional>
#include <vector>
#include <algorithm>

class Thing {
private:
const int id;

public:
Thing(int id);
const int ID() const;
};

Thing::Thing(int id) : id(id) { }

const int Thing::ID() const {
return id;
}

inline bool operator==(const Thing& lhs, const Thing& rhs) {
return lhs.ID() == rhs.ID();
}
inline bool operator!=(const Thing& lhs, const Thing& rhs) {
return !(lhs == rhs);
}

int main() {
Thing t1(5);
Thing t2(7);

auto ref1 = std::ref(t1);
auto ref2 = std::ref(t2);

std::vector<std::reference_wrapper<Thing>> v;
v.push_back(ref1);
v.push_back(ref2);

auto pos = std::find(v.begin(), v.end(), ref2);
}

最佳答案

正确的解决方案是将运算符移动到 Argument-dependent lookup (ADL) 所在的命名空间中可以找到它们:

namespace Test {

class Thing {
private:
const int id;

public:
Thing(int id);
const int ID() const;
};


inline bool operator==(const Thing& lhs, const Thing& rhs) {
return lhs.ID() == rhs.ID();
}
inline bool operator!=(const Thing& lhs, const Thing& rhs) {
return !(lhs == rhs);
}

}

Test::Thing::Thing(int id) : id(id) { }

const int Test::Thing::ID() const {
return id;
}

[Live example]

标准库已经用 << 等运算符完成了同样的工作用于流插入。

关于c++ - std::find 在 std::vector<std::reference_wrapper<T>> 上失败并出现 "no match for ‘operator==’“当 T 在 namespace 中时出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58184012/

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