我正在開發基於表達式模板和運算符/函數重載的自動差分工具。模板的std ::最大功能,例如,已成功過載:C++函數重載,表達式模板和名稱空間
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 :: namespace,例如max函數? (請不要使用C++ 11功能)爲什麼編譯器認爲std :: max是更好的匹配?
好的,我知道在編寫ead ::之前函數名不是什麼大不了的,但我想保存用戶輸入。
在哪個命名空間中定義了「adnumber」? – pmr
@pmr,在ead命名空間 – montefuscolo
'adnumber'的確切類型是什麼?它是否從'ExprWrapper'繼承? – pmr