几个问题boost::swap.请参考下面的代码,它基本上是一个剪切粘贴boost/swap.hpp.我指的是库版本1.43.0.
namespace boost_swap_impl
{
template<class T>
void swap_impl(T& left, T& right)
{
using namespace std;//use std::swap if argument dependent lookup fails
swap(left,right);
}
template<class T, std::size_t N>
void swap_impl(T (& left)[N], T (& right)[N])
{
for (std::size_t i = 0; i < N; ++i)
{
::boost_swap_impl::swap_impl(left[i], right[i]);
}
}
}
namespace boost
{
template<class T1, class T2>
void swap(T1& left, T2& right)
{
::boost_swap_impl::swap_impl(left, right);
}
}
Run Code Online (Sandbox Code Playgroud)
boost::swap声明为template <typename T1, typename T2>在其余代码中它处理相同类型的时间? …我刚读过这篇文章:C++命名空间的乐趣 作者表明编译器在遇到第一个时会停止查找重载,这里使用命名空间.
namespace A
{
void f(int x); // like our std::sqrt(double)
}
namespace B
{
struct S {}; // user-defined type with associated namespace B
void f(S);
void f(int, int);
void test1()
{
using namespace A; // using DIRECTIVE
f(1); // ERROR namespace A is not considered because
// B contains two overloads for 'f'
f(1,2); // OK B::f(int,int)
f(B::S()); // OK B::f(S)
}
void test2()
{
using A::f; // using DECLARATION
f(1); // OK A::f(int)
f(1,2); // …Run Code Online (Sandbox Code Playgroud) 这是代码示例:
namespace A
{
int k;
}
void k(int,int){/*dosomething*/}
int main()
{
using namespace A;
k(1,1);//ooop!k is ambiguous!
}
Run Code Online (Sandbox Code Playgroud)
发生了什么?我认为它不应该是模糊的,因为它们是不同的类型.为什么它含糊不清?有了int k它是不可能的k(1,1).
所以它与名称实际上没有任何关系?即使一个不是函数类型的名称在使用时也会引起歧义k(1,1),这在语法中是错误的,因为int k它不是函数?