gpt4 book ai didi

C++:不同命名空间中的多个运算符定义

转载 作者:太空狗 更新时间:2023-10-29 23:00:22 25 4
gpt4 key购买 nike

我对 operator<< 的两个定义之间的冲突感到困扰.

假设我一直是 ACE 库的忠实粉丝并且一直在使用 ACE_Time_Value在我的代码中。有一天,我注意到 ACE 6.x 已经出局,并试图将我的代码从 ACE 5.x 迁移到 6.x。然后我遇到了一个问题:ACE 6.x new introduced operator<<(std::ostream &, const ACE_Time_Value &)在全局命名空间中,但我的代码实现了我自己的 operator<< 版本自 5.x 时代以来,两个 operator<<矛盾。不幸的是“官方”的输出operator<<不能令人满意,我需要继续使用我自己的版本。我怎么能假装没有“官方”operator<<在全局命名空间中?幸运的是(?)我所有的代码都在我自己的命名空间下。

概念上我的问题可以概括为:

#include <iostream>
using namespace std;

struct ACE_Time_Value { };
ostream &operator<<(ostream &os, const ACE_Time_Value &) { os << "Apple" ; }
void foo(const ACE_Time_Value &) { cout << "Cherry" << endl; }

namespace mine {
ostream &operator<<(ostream &os, const ACE_Time_Value &) { os << "Banana" ; }
void foo(const ACE_Time_Value &) { cout << "Durian" << endl; }

void bar() {
ACE_Time_Value t;
::mine::foo(t); // OK
// cout << "The current time is " <<
// t << endl; // error: ambiguous overload for 'operator<<'
}
}

int main() {
mine::bar();
}

最佳答案

您可以执行如下操作并利用继承:

#include <iostream>
using namespace std;

struct ACE_Time_Value { };
ostream &operator<<(ostream &os, const ACE_Time_Value &) { os << "Apple" ; return os; }
void foo(const ACE_Time_Value &) { cout << "Cherry" << endl; }

namespace mine {
struct New_ACE_Time_Value: ACE_Time_Value {};

ostream &operator<<(ostream &os, const New_ACE_Time_Value &) { os << "Banana" ;
return os;
}
void foo(const ACE_Time_Value &) { cout << "Durian" << endl; }

void bar() {
New_ACE_Time_Value t;
::mine::foo(t); // OK
cout << "The current time is " <<
t << endl; // error: ambiguous overload for 'operator<<'
}
}

也许您还应该使“NewACE_Time_Value”不可复制,以摆脱对象切片问题。

关于C++:不同命名空间中的多个运算符定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33934701/

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