This question already has answers here:
Interesting behavior of compiler with namespaces
(3 个回答)
6年前关闭。
我遇到了一个奇怪的命名空间范围行为(使用 g++ 4.8.2)。
为了解释这个问题,我提取了一个重现这种奇怪行为的最小代码:
在这段代码中,我希望 G++ 会提示“foo”没有在“bar”的范围内定义,但事实并非如此;代码编译得很好。
所以我有点困惑。
g++ 错了吗(命名空间泄漏)?或者,如果没有,“foo”根据哪种机制在“bar”中可见?
(3 个回答)
6年前关闭。
我遇到了一个奇怪的命名空间范围行为(使用 g++ 4.8.2)。
为了解释这个问题,我提取了一个重现这种奇怪行为的最小代码:
namespace Weird {
template <typename T>
struct Rec
{
T val;
Rec( T const& _val ) : val( _val ) {}
};
template <typename T>
Rec<T>
foo( Rec<T> const& r )
{
return Rec<T>( r.val * 2 );
}
};
Weird::Rec<double>
bar( Weird::Rec<double> const& _input )
{
return foo( _input );
}
在这段代码中,我希望 G++ 会提示“foo”没有在“bar”的范围内定义,但事实并非如此;代码编译得很好。
所以我有点困惑。
g++ 错了吗(命名空间泄漏)?或者,如果没有,“foo”根据哪种机制在“bar”中可见?
最佳答案
这就是 argument-dependent lookup (ADL),也称为 Koenig 查找。
简而言之,使用运算符或未修饰的函数调用将在操作数或参数的封闭命名空间中查找名称。
关于c++ - 命名空间范围的模板函数在另一个命名空间中可见,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30886957/
10-15 07:53