複数の算術型で動作するプロジェクトを開発しています。そこで、ユーザー定義の算術型の最小要件が定義されているヘッダーを作成しました。
user_defined_arithmetic.h :
typedef double ArithmeticF; // The user chooses what type he
// wants to use to represent a real number
namespace arithmetic // and defines the functions related to that type
{
const ArithmeticF sin(const ArithmeticF& x);
const ArithmeticF cos(const ArithmeticF& x);
const ArithmeticF tan(const ArithmeticF& x);
...
}
私を悩ませているのは、次のようなコードを使用するときです。
#include "user_defined_arithmetic.h"
void some_function()
{
using namespace arithmetic;
ArithmeticF lala(3);
sin(lala);
}
コンパイラ エラーが発生します。
error: call of overloaded 'sin(ArithmeticF&)' is ambiguous
candidates are:
double sin(double)
const ArithmeticF arithmetic::sin(const ArithmeticF&)
<math.h>
ヘッダーのみを使用したことはありません<cmath>
。using namespace std
ヘッダー ファイルで を使用したことはありません。
gcc 4.6.* を使用しています。あいまいな宣言を含むヘッダーを確認したところ、次のようになりました。
mathcalls.h :
Prototype declarations for math functions; helper file for <math.h>.
...
<cmath>
が含まれていることはわかっています<math.h>
が、 std 名前空間による宣言を保護する必要があります。<cmath>
ヘッダーを掘り下げて見つけました:
cmath.h :
...
#include <math.h>
...
// Get rid of those macros defined in <math.h> in lieu of real functions.
#undef abs
#undef div
#undef acos
...
namespace std _GLIBCXX_VISIBILITY(default)
{
...
したがって、名前空間 stdは#include <math.h>
. ここに何か問題がありますか、それとも私は何かを誤解しましたか?