我正在开发一个基于表达式模板和运算符/函数重载的自动微分工具。例如,模板std::max函数已成功重载:
namespace ead {
...
template<class A>
struct ExprWrap
{
inline
operator A const& () const
{ return *static_cast<A const*>(this);}
};
class adnumber : public ExprWrap<adnumber>
{ ..... };
template<typename L, typename R>
class MaxExpr : public ExprWrap<MaxExpr<L,R> >{ ...... };
// overloading std::max
template<typename L, typename R>
MaxExpr<L,R>
max (ExprWrap<L> const& l, ExprWrap<R> const& r)
{
return MaxExpr<L,R>(l,r); // return an expression
}
...
}
但在如下代码中
using namespace std;
using namespace ead;
adnumber x,y,z;
z = max(x,y); // call std::max
如果命名空间被省略,则使用std:: ,而对于某些其他函数,则使用ead::。是否有强制编译器始终选择 ead:: 命名空间的技巧,例如用于 max 函数?(请不要使用 C++11 功能)为什么编译器认为 std::max 更匹配?
好的,我知道在函数名称之前写ead::没什么大不了的,但我想避免用户打字。