gpt4 book ai didi

c++ - 带有来自另一个命名空间的 typedef 的 ADL

转载 作者:IT老高 更新时间:2023-10-28 22:28:32 26 4
gpt4 key购买 nike

我有这样的事情:

#include <iostream>
namespace N
{
typedef std::pair<int, double> MyPair;
std::ostream& operator << (std::ostream& o, MyPair const & mypair)
{
///
}
}

int main()
{
N::MyPair pr;
std::cout << pr;
}

这自然不行,因为ADL 找不到operator<<因为namespace NMyPair 无关(很遗憾)。 Afaik 可能不会添加到命名空间 std,所以如果我选择定义 operator <<在标准中,这有点非法。那么......在这种情况下该怎么办?我不想明确限定 operator << ,我也不想写using namespace N .所以,问题是:

  1. 如何重构代码?
  2. 为什么 ADL 不关联 typedef 的命名空间?严重的原因?这会很好,例如在这种情况下。谢谢

最佳答案

  1. 您可以在命名空间 N 中创建自己的类型,可能继承自 std::pair。您可以添加“使用命名空间 N;”里面主要。前者更有可能有用。

  2. 因为类型是在另一个命名空间中定义的,不能在两个中定义。

例子:

namespace N { 
struct MyPair : std::pair<int, double> {
MyPair(int first, double second) : std::pair<int, double>(first, second) {}
// add defaults if desired: first=0, second=0.0
// with defaults, you may want to make the ctor explicit or leave implicit

// also, if desired and you don't use two defaults above:
MyPair() : std::pair<int, double>(0, 0.0) {}

// in 0x, you can "import" the base's ctors with a using declaration
};
}

如果用作 std::pair 并不重要,您可以放弃继承并重命名成员。当然,无论哪种情况,您都可以添加其他方法,但如果您保留继承,则可以使用“重命名方法”:

int      & foo()       { return first; }
int const& foo() const { return first; }
double & bar() { return second; }
double const& bar() const { return second; }

关于c++ - 带有来自另一个命名空间的 typedef 的 ADL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4155450/

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