gpt4 book ai didi

c++ - 为什么我的模板化 operator== 没有被使用?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:00:27 29 4
gpt4 key购买 nike

我定义了 operator== 如下:

template <class State>
bool operator==(const std::shared_ptr<const State> &lhs,
const std::shared_ptr<const State> &rhs) {
return *lhs == *rhs;
}

这个运算符没有被实例化(在 gdb 中,我不能在 return 语句上设置断点——该行不存在)。

但是,此运算符应由此行中调用的 std::find 使用:

return std::find(v.begin(), v.end(), el) != v.end();

我在 gdb 的上面一行中检查了 v 的类型:

(gdb) whatis v
type = const std::vector<std::shared_ptr<Domains::IncWorst const>> &
(gdb) whatis el
type = const std::shared_ptr<Domains::IncWorst const> &

这不符合我的模板化 operator==StateIncWorst 吗?

我按如下方式实现了一个玩具示例并且示例有效,所以我不明白为什么真实代码没有。

template<class V, typename T>
bool in(const V &v, const T &el) {
return std::find(v.begin(), v.end(), el) != v.end();
}

struct MyState {
MyState(int xx) : x(xx) {}
bool operator==(const MyState &rhs) const {
return x == rhs.x;
}
int x;
};

template <class State>
bool operator==(const std::shared_ptr<const State> &lhs,
const std::shared_ptr<const State> &rhs) {
return *lhs == *rhs;
}

int main() {
std::vector<std::shared_ptr<const MyState>> v{
std::make_shared<const MyState>(5)};
auto p = std::make_shared<const MyState>(5);
std::cout << in(v, p) << std::endl; // outputs 1
return 0;
}

最佳答案

您的 operator== 模板位于错误的命名空间中。

为了被 ADL 找到,它必须在 std 命名空间中(根据 [namespace.std]/1 这将是非法的)或在 Domains 中(根据 [basic.lookup.argdep]/2 )。

然而,这仍然是非常危险的,因为如果任何执行相等比较的模板(例如但不限于 std::find)在您的 operator== 之前和之后被实例化 模板已声明,您的整个程序将根据 [temp.point]/8[basic.def.odr]/6 无效。

如果您必须为您的类型的 std::shared_ptr 提供运算符重载模板,最好在每个类的声明之后显式实例化它们,这样就有在类不可见的地方实例化模板的可能性更小:

struct MyState {
// ...
};
template bool operator==<MyState>(
const std::shared_ptr<MyState const>&,
const std::shared_ptr<MyState const>&);

如果有人在其他地方转发声明 MyState,这仍然可能有问题,但这可能是您能做的最好的事情。

关于c++ - 为什么我的模板化 operator== 没有被使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38638929/

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