式テンプレートと演算子/関数のオーバーロードに基づく自動微分ツールを開発しています。たとえば、テンプレート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::が使用されます。max 関数など、常に ead:: 名前空間を選択するようにコンパイラに強制するトリックはありますか? (C++11 機能なしでお願いします) なぜコンパイラは std::max の方が適していると考えるのですか? 関数名の前にead::
を書くことは大したことではないことはわかっていますが、ユーザーが入力する手間を省きたいのです。