【发布时间】:2013-04-15 16:30:33
【问题描述】:
请参考以下代码:
#include <algorithm>
namespace N
{
template <typename T>
class C
{
public:
void SwapWith(C & c)
{
using namespace std; // (1)
//using std::swap; // (2)
swap(a, c.a);
}
private:
int a;
};
template <typename T>
void swap(C<T> & c1, C<T> & c2)
{
c1.SwapWith(c2);
}
}
namespace std
{
template<typename T> void swap(N::C<T> & c1, N::C<T> & c2)
{
c1.SwapWith(c2);
}
}
如上所述,代码无法在 Visual Studio 2008/2010 上编译。错误是:
'void N::swap(N::C<T> &,N::C<T> &)' : could not deduce template argument for 'N::C<T> &' from 'int'.
但是,如果我注释掉 (1) 并取消注释 (2),它将编译 OK。 using namespace std 和 using std::swap 之间有什么区别可以解释这种行为?
【问题讨论】:
-
这似乎是一个范围问题。规则是(如果我没记错的话)它总是首先使用最本地的范围。所以它会使用
N::swap而不是std::swap,即使你有using namespace std -
顺便说一句,代码格式不正确,并且程序具有未定义的行为。您不能将函数模板 overloads 添加到
std命名空间,只能添加特化。 -
Exceptional C++[Bug]? 的可能重复项
-
没有不可推断的上下文,因此错误消息充其量是误导性的。
-
@Andy Prowl 你应该这样回答:如果代码格式不正确,那么特定编译的作用并不重要。
标签: c++ swap using-directives using-declaration