尽管命名空间不同,但重载函数的调用是不明确的
Call of overloaded function is ambiguous although different namespace
我明白如果不使用名称空间,为什么会出现以下问题。这个电话确实是模棱两可的。我以为 "using stD::swap;" 会定义要使用的方法。
为什么它适用于 "int" 但不适用于 "class"?
#include <memory>
namespace TEST {
class Dummy{};
void swap(Dummy a){};
void sw(int x){};
}
namespace stD {
void swap(TEST::Dummy a){};
void sw(int x){};
class aClass{
public:
void F()
{
using stD::swap;
TEST::Dummy x;
swap(x);
}
void I()
{
using stD::sw;
int b = 0;
sw(b);
}
};
}
这是错误信息:
../src/Test.h: In member function ‘void stD::aClass::F()’:
../src/Test.h:26:9: error: call of overloaded ‘swap(TEST::Dummy&)’ is ambiguous
swap(x);
^
../src/Test.h:26:9: note: candidates are:
../src/Test.h:17:6: note: void stD::swap(TEST::Dummy)
void swap(TEST::Dummy a){};
^
../src/Test.h:10:6: note: void TEST::swap(TEST::Dummy)
void swap(Dummy a){};
^
非常感谢您的回答。
这条线路正在使用 argument dependent lookup
TEST::Dummy x;
swap(x);
所以它会找到 void stD::swap(TEST::Dummy)
和 void TEST::swap(TEST::Dummy)
因为 x
带有 TEST::
命名空间。
在后一种情况下 int b = 0;
变量 b
不在命名空间中,因此由于您的 using
语句,唯一有效的调用函数是 stD::sw
.
我明白如果不使用名称空间,为什么会出现以下问题。这个电话确实是模棱两可的。我以为 "using stD::swap;" 会定义要使用的方法。
为什么它适用于 "int" 但不适用于 "class"?
#include <memory>
namespace TEST {
class Dummy{};
void swap(Dummy a){};
void sw(int x){};
}
namespace stD {
void swap(TEST::Dummy a){};
void sw(int x){};
class aClass{
public:
void F()
{
using stD::swap;
TEST::Dummy x;
swap(x);
}
void I()
{
using stD::sw;
int b = 0;
sw(b);
}
};
}
这是错误信息:
../src/Test.h: In member function ‘void stD::aClass::F()’:
../src/Test.h:26:9: error: call of overloaded ‘swap(TEST::Dummy&)’ is ambiguous
swap(x);
^
../src/Test.h:26:9: note: candidates are:
../src/Test.h:17:6: note: void stD::swap(TEST::Dummy)
void swap(TEST::Dummy a){};
^
../src/Test.h:10:6: note: void TEST::swap(TEST::Dummy)
void swap(Dummy a){};
^
非常感谢您的回答。
这条线路正在使用 argument dependent lookup
TEST::Dummy x;
swap(x);
所以它会找到 void stD::swap(TEST::Dummy)
和 void TEST::swap(TEST::Dummy)
因为 x
带有 TEST::
命名空间。
在后一种情况下 int b = 0;
变量 b
不在命名空间中,因此由于您的 using
语句,唯一有效的调用函数是 stD::sw
.