Reference to '*****' is ambiguous;之类的问题解决

本文探讨了在C++中,当同一标识符在多个命名空间中被定义时导致的引用模糊问题。通过实例说明了boost和std命名空间中function类型的冲突,并提供了解决方案,建议避免使用using namespace指令,转而明确指定命名空间。

造成这个问题的原因是:

        '*****'在一个以上的命名空间内被定义,使得有多个'*****'同时满足,系统不知具体使用哪一个;


如boost和std中都定义了function函数类型模板,如果在程序开头,同时使用using namespace std;和
using namespace boost;就会出现Reference to 'function' is ambiguous,的错误提示。

解决此类问题的办法是:尽量不要使用 using namespace xx;, 
       而是要用包含命名空间的变量类型,类似:using std::function; 或 std::function<void*(void*)>等

你遇到的错误: ``` reference to 'plus' is ambiguous ``` 是因为标识符 `plus` 与某些标准库中的名称发生了冲突(例如在某些平台上,`std` 命名空间或全局命名空间中可能存在 `plus` 的定义,如 `std::plus`)。 --- ### ❌ 问题原因: `plus` 是一个比较通用的标识符,在 C++ 标准库 `<functional>` 中有一个 `std::plus` 函数对象(functor),当你使用 `using namespace std;` 时,`std::plus` 会被引入到全局命名空间中,从而导致与你自己定义的 `plus` 函数发生命名冲突。 --- ### ✅ 解决方法: #### 方法一:重命名你的函数,避免冲突(推荐) 将 `plus` 改为 `addPoint`,将 `minus` 改为 `subtractPoint` 等更具体的名称: ```cpp #include <iostream> using namespace std; class Point { private: int x; int y; public: Point(int m = 0, int n = 0) : x(m), y(n) {} friend Point addPoint(Point& p1, Point& p2); friend Point subtractPoint(Point& p1, Point& p2); void display() const { cout << "(" << x << ", " << y << ")"; } }; // 加法友元函数实现 Point addPoint(Point& p1, Point& p2) { int newX = p1.x + p2.x; int newY = p1.y + p2.y; return Point(newX, newY); } // 减法友元函数实现 Point subtractPoint(Point& p1, Point& p2) { int newX = p1.x - p2.x; int newY = p1.y - p2.y; return Point(newX, newY); } // 测试程序 int main() { Point p1(3, 4); Point p2(1, 2); Point p3 = addPoint(p1, p2); Point p4 = subtractPoint(p1, p2); cout << "p1: "; p1.display(); cout << endl; cout << "p2: "; p2.display(); cout << endl; cout << "p1 + p2 = "; p3.display(); cout << endl; cout << "p1 - p2 = "; p4.display(); cout << endl; return 0; } ``` --- #### 方法二:将自定义函数放入命名空间中 ```cpp namespace MyMath { Point plus(Point& p1, Point& p2) { return Point(p1.x + p2.x, p1.y + p2.y); } Point minus(Point& p1, Point& p2) { return Point(p1.x - p2.x, p1.y - p2.y); } } ``` 调用时使用: ```cpp Point p3 = MyMath::plus(p1, p2); ``` 这样可以避免命名冲突。 --- #### 方法三:避免使用 `using namespace std;`(推荐) ```cpp #include <iostream> // 不要写 using namespace std; int main() { ... std::cout << "p1: "; ... } ``` 这样 `std::plus` 不会污染全局命名空间,`plus` 可以安全使用。 --- ### ✅ 总结: - **命名冲突** 是你遇到 `reference to 'plus' is ambiguous` 的根本原因。 - **解决方式** 包括: - 重命名函数 - 使用命名空间 - 避免 `using namespace std;` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值